Swift 5、iOS 12、Xcode 10
我终于在我的 ListingsViewController 上实现了一个搜索栏,它运行得非常好 - 但初始数据没有填充到表中。
我意识到这是一个笨拙的实现,但我正在学习,并且我只使用我可以理解的代码。我已经为此研究了两天——我尝试创建一个结构并以这种方式引入数据,但我什至无法获得数组。我尝试将其作为 NSArray 和 Array 和 Object 引入,但是我无法加载初始表,或者我根本无法获取要解析的数据,或者我无法让搜索工作。
我怀疑这与我调用 loadData() 函数的方式、时间或地点有关,但我就是无法弄清楚。
class ListingsViewController: UITableViewController, UISearchResultsUpdating {
var tableData = [String]()
var filteredTableData = [String]()
var resultSearchController = UISearchController()
func updateSearchResults(for searchController: UISearchController) {
filteredTableData.removeAll(keepingCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (tableData as NSArray).filtered(using: searchPredicate)
filteredTableData = array as! [String]
self.tableView.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
tableData = [String]()
loadData()
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.reloadData()
resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
tableView.tableHeaderView = controller.searchBar
return controller
})()
tableView.reloadData()
}
func loadData() {
guard let url = URL(string: "--------------") else {return }
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let dataResponse = data, error == nil else {
print(error?.localizedDescription ?? "Response Error")
return
}
do {
let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: [])
guard let jsonArray = jsonResponse as? [[String:Any]] else { return }
for dic in jsonArray {
self.tableData.append(dic["name"] as! String)
// self.feedItems.append(Listing(id: (dic["id"] as! String), city_id: (dic["city_id"] as! String), category: (dic["category"] as! String), sub_category: (dic["sub_category"] as! String), name: (dic["name"] as! String), phone: (dic["phone"] as! String), email: (dic["email"] as! String), website: (dic["website"] as! String), address: (dic["address"] as! String), comment: (dic["comment"] as! String), recommendedby: (dic["recommendedby"] as! String)))
}
} catch let parsingError {
print("Error", parsingError)
}
}
self.tableView.reloadData()
task.resume()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (resultSearchController.isActive) {
return filteredTableData.count
} else {
return tableData.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.textColor = .white
cell.backgroundColor = .black
cell.tintColor = .lightText
if (resultSearchController.isActive) {
cell.textLabel?.text = filteredTableData[indexPath.row]
return cell
} else {
cell.textLabel?.text = tableData[indexPath.row]
return cell
}
}
}
当我从标签栏切换到 ListingsViewController 时,我希望显示完整的列表列表。相反,我得到一张空白表格。
但是,如果我点击搜索栏并开始输入,我会得到匹配的结果 - 当我取消搜索时,我可以看到表格中的所有结果。
(此外,当我点击搜索栏时,即使我取消搜索,我的导航栏也会消失并且不会回来。即使我切换到其他选项卡并返回。也无法弄清楚这一点。)
最佳答案
您缺少 TableView 的委托(delegate)和数据源 添加此:
class ListingsViewController: UITableViewController, UISearchResultsUpdating,UITableViewDelegate,UITableViewDataSource {
//your class code here
}
并在您的viewDidLoad
上添加以下内容:
self.tableView.delegate = self
self.tableView.dataSource = self
这应该可以工作,请注意,在调用委托(delegate)和数据源之后,您的行单元格和行数函数将被调用,因此请确保您使用的数组此时不为零
关于ios - TableViewController 在搜索时填充,但不会加载初始 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57238168/