Попытка загрузить представление контроллера вида во время его освобождения не допускается для 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 3

1 ответ:

Если вы создаете переменную в функции (viewDidLoad), ее время жизни совпадает с временем жизни этой функции. В этом случае вы пытаетесь установить представление заголовка таблицы как searchController, который освобождается (его время жизни совпадает с viewDidLoads)

Когда вы создаете переменную вне viewDidLoad и создаете ее экземпляр позже, эта переменная имеет тот же срок службы, что и viewController / class