Попытка загрузить представление контроллера вида во время его освобождения не допускается для UISearchViewController
Этот вопрос уже задавался раньше, но я не могу получить ясного объяснения по этому вопросу. У меня есть простое приложение с tableview и функцией поиска. В viewDidLoad()
, я называю setUpSearchView()
, который определяется следующим образом
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = true
searchController.dimsBackgroundDuringPresentation = false
self.tableView.tableHeaderView = searchController.searchBar
Этот код не работает должным образом. На консоли я вижу эту ошибку
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior
Более того, searchcontroller не анимирует должным образом и не вызывает делегат updateSearchResultsForSearchController
, Когда я печатаю на панели поиска.
Но, все эти вопросы являются легко исправляется путем внесения незначительных изменений в функцию инициализации searchController. Вместо того, чтобы объявлять searchController
как локальную переменную в функции, если я объявляю ее переменной экземпляра вне метода, как это var searchController:UISearchController!
, все работает, хотя я понятия не имею, почему.
Теперь код будет выглядеть так
var searchController:UISearchController!
В setUpSearchView ()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = true
searchController.dimsBackgroundDuringPresentation = false
self.tableView.tableHeaderView = searchController.searchBar
Вот ссылка на viewController на github: https://github.com/tmsbn/marvel_heroes/blob/master/avengers/HeroesListController.swift
Может ли кто-нибудь объяснить, почему это происходит? Это ошибка со Свифтом? Или это что-то в iOS, о чем я не знаю.1 ответ:
Если вы создаете переменную в функции (viewDidLoad), ее время жизни совпадает с временем жизни этой функции. В этом случае вы пытаетесь установить представление заголовка таблицы как searchController, который освобождается (его время жизни совпадает с viewDidLoads)
Когда вы создаете переменную вне viewDidLoad и создаете ее экземпляр позже, эта переменная имеет тот же срок службы, что и viewController / class