2016-04-15 109 views
2

此問題以前已被問到,但我無法獲得有關此問題的明確說明。我有一個簡單的應用程序與tableview和搜索功能。在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委託當我在搜索欄鍵入。

但是,所有這些問題都可以通過對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

相關問題