UISearchViewController

时间:2016-04-15 07:18:44

标签: ios swift uisearchcontroller

之前已经提出过这个问题,但我无法对此问题做出明确的解释。我有一个简单的应用程序,具有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中我不了解的东西。

1 个答案:

答案 0 :(得分:3)

如果要在函数(viewDidLoad)中创建变量,它的生命周期与函数生存期相同。在这种情况下,您尝试将表头视图设置为正在释放的searchController(它的生命周期与viewDidLoads相同)

当您在viewDidLoad之外创建变量并稍后实例化时,该变量与viewController / class具有相同的生命周期