我有一个{@ {1}},用于填充位置,搜索栏设置为该UITableView
的标题。
每当输入某些字符或输入一定数量的字符时,应用程序就会崩溃,不会给我任何错误代码。
有时,应用程序在输入一个字符(可能是2个字符,可能是3个或可能是4个字符)后崩溃了。似乎没有明显的原因导致崩溃。
搜索功能可以正确搜索并填充过滤后的结果,但出于明显的原因,如果输入了看似任意数量的字符,则会崩溃。
我已经尝试使用异常断点工具,但它没有提供任何新信息。我认为这与没有搜索结果有关。
UITableView
预期结果是override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search Locations..."
navigationItem.hidesSearchBarWhenScrolling = false
searchController.hidesNavigationBarDuringPresentation = false
locationTableView.tableHeaderView = searchController.searchBar
searchController.searchBar.sizeToFit()
searchController.searchBar.showsCancelButton = false
searchController.searchBar.barTintColor = UIColor.white
filteredData = locationList
// Sets this view controller as presenting view controller for the search interface
definesPresentationContext = true
locationList = createArray()
// Reload the table
let range = NSMakeRange(0, self.locationTableView.numberOfSections)
let sections = NSIndexSet(indexesIn: range)
self.locationTableView.reloadSections(sections as IndexSet, with: .fade)
}
func updateSearchResults(for searchController: UISearchController) {
filterContentForSearchText(searchController.searchBar.text!)
}
func searchBarIsEmpty() -> Bool {
// Returns true if the text is empty or nil
return searchController.searchBar.text?.isEmpty ?? true
}
func filterContentForSearchText(_ searchText: String) {
filteredData = locationList.filter({( locationName : Location) -> Bool in
return locationName.locationName.lowercased().contains(searchText.lowercased())
})
let range = NSMakeRange(0, self.locationTableView.numberOfSections)
let sections = NSIndexSet(indexesIn: range)
self.locationTableView.reloadSections(sections as IndexSet, with: .fade)
}
func isFiltering() -> Bool {
return searchController.isActive && !searchBarIsEmpty()
}
func locationTableView(_ locationTableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isFiltering() {
return filteredData.count
}
return locationList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let locationCell = locationTableView.dequeueReusableCell(withIdentifier: "locationCell", for: indexPath) as! locationCell
let location: Location
if isFiltering() {
location = filteredData[indexPath.row]
} else {
location = locationList[indexPath.row]
}
locationCell.setLocation(location: location)
return locationCell
}
应该填充有过滤结果。相反,如果输入的字符过多(通常为1-4个字符),它将填充它们并崩溃。
答案 0 :(得分:0)
好像您希望tableView为您提供节的数量...应该由您自己的数据源驱动。
由于您未在数据源中提供numberOfSections
,所以我假设它为1。如果所有行都位于1部分中,则可以大大简化您正在执行的所有漂亮的重装操作。 / p>
我建议您在https://developer.apple.com/documentation/uikit/uitableviewdatasource上阅读UITableView dataSource协议
在阅读您正在阅读的教程时,似乎正在使用reloadData()
,它迫使tableView忽略先前的行数,并以新的行数重新加载其内容。根据您到目前为止的发现,我认为这是根本原因的一部分,而tableview错误地假定了预定的行数,并试图检索不再在范围内的单元格。