之前已经提出过这个问题,但我无法对此问题做出明确的解释。我有一个简单的应用程序,具有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
此外,我在搜索栏上输入时,搜索控制器没有正确设置动画,也没有调用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
以下是github上的viewController的链接:https://github.com/tmsbn/marvel_heroes/blob/master/avengers/HeroesListController.swift
有人可以解释为什么会这样吗?这是swift的错误吗?或者它是iOS中我不了解的东西。
答案 0 :(得分:3)
如果要在函数(viewDidLoad)中创建变量,它的生命周期与函数生存期相同。在这种情况下,您尝试将表头视图设置为正在释放的searchController(它的生命周期与viewDidLoads相同)
当您在viewDidLoad之外创建变量并稍后实例化时,该变量与viewController / class具有相同的生命周期