В конце концов я решил эту проблему, заменив UISearchController на простой (r) UISearchBar.
Возможно, это не тот ответ, который вы хотели услышать, но UISsearchController уже был в беспорядке на iOS12, тот же код на iOS13 работает, но дает ужасные артефакты пользовательского интерфейса. Например, исчезновение или перекрытие панели поиска с заголовком, пробел между панелью поиска и первым элементом таблицы или скрытие первого элемента списка под кнопками области... Все разные проблемы между iOS12 и 13, но они никогда не выглядят хорошо.
Итак, в целом я потратил 6 часов, пытаясь починить контроллер поиска, потерпел неудачу, а затем потратил 30 минут на миграцию на панель поиска.
Я добавил UISearchBar, просто используя Interface Builder в Xcode10.3. Для рефакторинга в основном мне приходилось просто заменять searchController.searchBar.xx на searchBar.xx . Основное усилие заключалось в повторной реализации UISeachBarDelegates. Просто чтобы показывать только кнопки области и кнопку отмены, пока пользователь выполняет поиск, а затем удалять их. Код ниже дает хороший обзор того, что я сделал:
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate {
var fetchedItemsController: NSFetchedResultsController<Item>! = NSFetchedResultsController()
@IBOutlet weak var searchBar: UISearchBar! //hooked up to IB
//GONE IS: let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
initializeFetchedResultsControllerForItems()
//Enable search controller
searchBar.scopeButtonTitles = [NSLocalizedString("Name", comment: ""),
NSLocalizedString("Birthdate", comment: ""),
NSLocalizedString("Employer", comment: "") ]
searchBar.placeholder = NSLocalizedString("Search", comment: "")
searchBar.delegate = self
searchBar.showsScopeBar = false
searchBar.showsCancelButton = false
tableView.contentInsetAdjustmentBehavior = .automatic
self.tableView.tableHeaderView = searchBar //add the searchbar as tableheader view
self.initializeFetchedResultsControllerForItems()
}
// MARK: - Data loading from CoreData
private func initializeFetchedResultsControllerForItems(searchText: String = "", scopeIndex: Int = 0) {
//print("FETCH RESULTS WITH FILTER: \(searchText) en SCOPE: \(scopeIndex)")
//Do whatever searches you need to do to update the FetchedResultsController
//..
self.tableView.reloadData()
}
}
extension MasterViewController: UISearchBarDelegate { //the delegates for the searchbar
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchBar.showsScopeBar = true //show the scopebar when users adds text to searchbar
searchBar.showsCancelButton = true //also show the cancel button
searchBar.sizeToFit()
self.tableView.reloadData() //since the scopebar is there, the table needs to move a bit down
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: searchBar.selectedScopeButtonIndex)
}
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
switch (selectedScope) {
case 0: searchBar.placeholder = NSLocalizedString("Seach on name", comment: "")
case 1: searchBar.placeholder = NSLocalizedString("Search on birthdate", comment: "")
case 2: searchBar.placeholder = NSLocalizedString("Search on employer", comment: "")
default: searchBar.placeholder = NSLocalizedString("Search", comment: "")
searchBar.showsScopeBar = true
searchBar.sizeToFit()
}
initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: selectedScope)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.placeholder = NSLocalizedString("Search", comment: "")
searchBar.showsScopeBar = false
searchBar.showsCancelButton = false
searchBar.endEditing(true)
searchBar.text = ""
searchBar.sizeToFit()
initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: searchBar.selectedScopeButtonIndex)
}
}
person
Rodge
schedule
01.10.2019
navigationItem.searchController
. Я думаю, что это связано с некоторыми базовыми изменениями iOS 13, поскольку этого не происходит при работе с текущим Xcode с текущими версиями iOS. - person UrosMi   schedule 16.08.2019