为来自API的数据的tableView单元格设置UISearchController



我真的很难为我的tableView实现UISearchController,我按照Sean Allen的视频进行了解释,并像他一样做了解释,但我想问题出在我身上,我无法解决。

我希望用户在打字时实时搜索要更新的单元格,并且他将搜索的主要内容是cell.veturaOutlet.text = currentVechicle.Plate

如果你有时间帮忙,请这样做,因为我是Swift的新手,我真的很享受,只是开始时遇到的这些小问题

这是一张细胞的照片!

class MonitorimiViewController: UIViewController {

@IBOutlet weak var monitorimiTableView: UITableView!
@IBOutlet weak var loaderMonitorimi: UIActivityIndicatorView!

var listOfVechicle: [Vehicles] = []
var filteredVehicles: [Vehicles] = []
var listOfVehicles = [Vehicles]()    

override func viewDidLoad() {
super.viewDidLoad()
fetchAndReloadData()
configureSearchController()

loaderMonitorimi.hidesWhenStopped = true
loaderMonitorimi.startAnimating()

Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { [self] _ in
monitorimiTableView.reloadData()
configureTableView()
loaderMonitorimi.stopAnimating()
}
}

func configureTableView() {
monitorimiTableView.delegate = self
monitorimiTableView.dataSource = self
monitorimiTableView.rowHeight = 225
}
func configureSearchController() {
let searchController = UISearchController()
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.searchBar.placeholder = "Search"
navigationItem.searchController = searchController
}

func fetchAndReloadData(){
APICaller.shared.getVehicles(for: APICaller.shared.id!) {[weak self] (result) in
guard let self = self else { return }

switch result {
case .success(let vehicle):
self.listOfVechicle = vehicle
DispatchQueue.main.async {
self.monitorimiTableView.reloadData()
}
case .failure(let error):
print(error)
}
}
}
}

extension MonitorimiViewController: UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate{
func updateSearchResults(for searchController: UISearchController) {
guard let filter = searchController.searchBar.text, !filter.isEmpty else { return 
}

filteredVehicles = filteredVehicles.filter { $0.Plate!.lowercased().contains(filter.lowercased()) }
monitorimiTableView.reloadData()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listOfVechicle.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "monitorimiCell", for: indexPath) as? MyCustomCell1 else {return UITableViewCell()}
let currentVechicle = listOfVechicle[indexPath.row]


cell.veturaOutlet.text = currentVechicle.Plate
cell.shpejtsiaAktualeOutlet.text = currentVechicle.Speed!
cell.perditsuarOutlet.text = "(currentVechicle.LastCommunicationDate!.convertToDisplayForm())"
cell.pasagjereOutlet.text = "(currentVechicle.Passengers!) Person/a"
cell.vozitesiOutlet.text = "(currentVechicle.Driver!)"

return cell
}
}

您可以使用这个:

var initialListOfVechicles: [Vehicles] = []
var vehicles: [Vehicles] = []

保留一个包含所有数据(initialListOfVechicles(,另一个(vehicles(用于操作列表(即filterinig(并填充tableView。

APICaller.shared.getVehicles(for: APICaller.shared.id!) {[weak self] (result) in
guard let self = self else { return }

switch result {
case .success(let vehicle):
self.initialListOfVechicles = vehicle
self.vehicles = self.initialListOfVechicles
...
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return vehicles.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "monitorimiCell", for: indexPath) as? MyCustomCell1 else {return UITableViewCell()}
let currentVechicle = vehicles[indexPath.row]
...
}

当你想过滤时:

func updateSearchResults(for searchController: UISearchController) {
guard let filter = searchController.searchBar.text, !filter.isEmpty else { 
vehicles = initialListOfVechicles
monitorimiTableView.reloadData()
return
}

vehicles = initialListOfVechicles.filter { $0.Plate!.lowercased().contains(filter.lowercased()) }
monitorimiTableView.reloadData()
}

旁注:
$0.Plate!如果Platenil,这将导致崩溃。为什么它在第一个位置是可选的
建议以小写字母开头命名变量,因此它应该是plate而不是Plate。如果它来自JSON,您可以使用CodingKeys来正确匹配它们(即,plate用于密钥Plate(,并使用keyDecodingStrategy

最新更新