输入字符时,搜索栏崩溃的应用

时间:2019-05-28 20:35:17

标签: swift uitableview uisearchbar uisearchcontroller

我有一个{@ {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个字符),它将填充它们并崩溃。

1 个答案:

答案 0 :(得分:0)

好像您希望tableView为您提供节的数量...应该由您自己的数据源驱动。

由于您未在数据源中提供numberOfSections,所以我假设它为1。如果所有行都位于1部分中,则可以大大简化您正在执行的所有漂亮的重装操作。 / p>

我建议您在https://developer.apple.com/documentation/uikit/uitableviewdatasource上阅读UITableView dataSource协议


在阅读您正在阅读的教程时,似乎正在使用reloadData(),它迫使tableView忽略先前的行数,并以新的行数重新加载其内容。根据您到目前为止的发现,我认为这是根本原因的一部分,而tableview错误地假定了预定的行数,并试图检索不再在范围内的单元格。