我正在开发一个汽车租赁应用,它接受用户的输入并将其放入我的SQLite
数据库。
在我的tableview viewcontroller中,它正在显示信息。
示例:
Cell 1: Toyota, Philippines, 5000
Cell 2: Nissan, America, 1000
Cell 3: Mitsubishi, England, 2000
问题是,每当我搜索时,例如我搜索了“英格兰”,它显示的唯一正确的数据只是位置。所以它会显示如下:
Cell 1: Toyota, England, 5000
Toyota
和5000
来自索引0
。唯一正确的数据是英格兰。
每当我搜索“英格兰”时,我想要的结果:
Cell 1: Mitsubishi, England, 2000
请帮我修理车型和速率以便显示它。
这是我的表视图控制器中的代码:
import UIKit
import SQLite
class CarList: UIViewController, UITableViewDataSource, UITableViewDelegate,
UISearchBarDelegate {
@IBOutlet var tableView: UITableView!
@IBOutlet var searchBar: UISearchBar!
//variables I used to append my database
var carType = [String]()
var rate = [String]()
var location = [String]()
//variables I used to append my filtered data for searchbar
var filteredLocation: [String]!
var filteredCar: [String]!
var filteredRate: [String]!
var img = [UIImage(named: "Toyota"), UIImage(named: "Nissan")]
override func viewDidLoad() {
super.viewDidLoad()
searchBar.placeholder = "Search Location"
do{
let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileUrl = documentDirectory.appendingPathComponent("users").appendingPathExtension("sqlite3")
let database = try Connection(fileUrl.path)
Variables.database = database
}catch {
print(error)
}
//appending my database to my array
do{
let users = try Variables.database.prepare(Variables.rTable)
for user in users {
carType.append(user[Variables.rCar])
rate.append(user[Variables.rRate])
location.append(user[Variables.rLocation])
}
}catch{
print(error)
}
searchBar.delegate = self
//assigning the array to filtered data
filteredLocation = location
filteredCar = carType
filteredRate = rate
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredLocation.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CarListCell
cell.carType.text = "Car Type: " + filteredCar[indexPath.row]
cell.rate.text = "Location: " + filteredLocation[indexPath.row]
cell.carImage.image = UIImage(named: filteredCar[indexPath.row]+".jpg")
return (cell)
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredLocation = searchText.isEmpty ? location : location.filter({(dataString: String) -> Bool in
return dataString.range(of: searchText, options: .caseInsensitive) != nil
})
tableView.reloadData()
}
//below is the code when I clicked on the table view cell, it will pass the data.
//but the filtered location is the only one working.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "info" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let controller = segue.destination as! CarInfo
controller.getCar = filteredCar[indexPath.row]
controller.getRate = filteredRate[indexPath.row]
controller.getLocation = filteredLocation[indexPath.row]
}
}
}
} // End Class
这是我的数据库表,如果你需要它,我使用Variables.swift将它分开。
import Foundation
import UIKit
import SQLite
class Variables: UIViewController{
var database: Connection!
let rTable = Table("rTable")
let rId = Expression<Int>("rId")
let rCar= Expression<String>("rCar")
let rLocation = Expression<String>("rLocation")
let rRate = Expression<String>("rRate")
}
答案 0 :(得分:0)
不是为数据创建3个数组,而是为它们创建对象
class Car{
var carType:String?
var location:String?
var rate:String?
}
然后
var filteredLocation: [String]!
var filteredCar: [String]!
var filteredRate: [String]!
制作本
var cars = [Car]()
而不是
for user in users {
carType.append(user[Variables.rCar])
rate.append(user[Variables.rRate])
location.append(user[Variables.rLocation])
}
制作本
for user in users {
let car = Car()
car.carType = user[Variables.rCar]
car.location = user[Variables.rLocation]
car.rate = user[Variables.rRate]
cars.append(car)
}
和cellForRow将其更改为
cell.carType.text = "Car Type: " + cars[indexPath.row].carType
cell.rate.text = "Location: " + cars[indexPath.row].rate
cell.carImage.image = UIImage(named: cars[indexPath.row].carType+".jpg")
重要的是
filteredCars = cars.filter{
$0.carType.lowercased == searchText.lowercased}
}
其中filteredCars是汽车对象的数组。希望这能帮助你。