2016-04-15 2 views
2

Этот вопрос задан раньше, но я не могу получить четкое объяснение этой проблемы. У меня есть простое приложение с табличным представлением и функцией поиска. В viewDidLoad(), я называю setUpSearchView(), который определяется как этотПопытка загрузить представление контроллера просмотра во время его освобождения не разрешена для UISearchViewController

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 делегата, когда я печатаю на SearchBar.

Но все эти проблемы легко устраняются путем внесения незначительных изменений в функцию инициализации 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, о котором я не знаю.

+0

см. это, когда это поможет вам http://stackoverflow.com/questions/32282401/attempting-to-load-the-view-of-a-view-controller-while-it-is -deallocating-uis –

ответ

1

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

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

+0

Извините, но я не совсем понимаю. Почему метод searchController освобождается до того, как он будет установлен в виде заголовка таблицы? Является ли настройка заголовка таблицы асинхронной функцией. – TMS

+0

Я думаю, что при запуске кода компилятор видит, что переменная будет освобождена в конце viewDidLoad, поэтому установка ее как заголовка таблицы предотвращает эту ошибку. Это связано с тем, что, когда заголовок таблицы уже установлен, все указатели на этот объект исчезли, поэтому методы делегатов не работают и т. Д. –

+0

Понятно, что это имеет смысл. Спасибо вам за разъяснение! – TMS

Смежные вопросы

 Смежные вопросы