2015-09-20 102 views
10

我收到以下錯誤。UISearchController - 警告試圖加載視圖控制器的視圖

嘗試而它是 解除分配是不允許的,並且可能導致未定義的行爲()

嘗試了以下解決方案,但對於我Attempting to load the view of a view controller while it is deallocating... UISearchController

不起作用加載視圖控制器的視圖

演示項目可在鏈接中找到。

  1. 點擊主控制器中的添加按鈕,添加幾個時間戳。
  2. 在主視圖控制器的行之間切換,您將看到上述錯誤。

代碼如下所示,可以從簡稱time at下載。

import UIKit 

class DetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating,UISearchBarDelegate { 

    @IBOutlet weak var basicTable: UITableView!   
    var tblSearchController:UISearchController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib.  
     self.tblSearchController = UISearchController(searchResultsController: nil) 
     self.basicTable.tableHeaderView=self.tblSearchController.searchBar 
//  self.tblSearchController.edgesForExtendedLayout = (UIRectEdge.Top) 
//  self.tblSearchController.extendedLayoutIncludesOpaqueBars = true 
     self.tblSearchController.searchResultsUpdater = self 
     self.tblSearchController.searchBar.delegate = self 
     self.tblSearchController.searchBar.sizeToFit() 
//  self.tblSearchController.searchBar.frame=CGRectMake(0, 0, self.basicTable.frame.size.width, 44.0) 
     self.tblSearchController.hidesNavigationBarDuringPresentation=true 
     self.tblSearchController.dimsBackgroundDuringPresentation=true 
     self.definesPresentationContext=true 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 0 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 0 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let aCell:UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("123") 
     return aCell 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     print("Begin Update = \(NSStringFromCGRect(self.tblSearchController.searchBar.frame)) \(self.tblSearchController.view.frame) ") 
    } 

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
     print("Begin= \(NSStringFromCGRect(searchBar.frame))") 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
     print("End=\(NSStringFromCGRect(searchBar.frame))") 
    } 
} 
+0

這可能無法解決問題,但最好調用'sizeToFit()'和_then_將搜索欄放到您的界面中。 – matt

+0

我有同樣的問題。如果你找到解決方案,請發佈。 – emresancaktar

回答

6

我看到這個同樣的問題,只是IOS9,並且也注意到這個錯誤報告http://www.openradar.me/22250107。目前看來目前還沒有解決辦法。

30

問題是UISearchController中的一個錯誤,它試圖在它的dealloc方法中加載它的視圖。可能它調用self.view,作者忘記了self.view導致視圖被加載。如果UISearchController已經被創建但尚未被使用,那麼它不會加載它的視圖並且會出現這個問題。在您的示例項目中,如果您點擊SearchBar,警告不會出現。

解決方法是強制它加載它的視圖。在你的代碼中有兩個地方可以做到這一點:viewDidLoad()或deinit。使用建議的行之一(loadViewIfNeeded()或_ = .view)不能同時使用。如果你只使用iOS 9,那麼最好的方法是在deinit中使用loadViewIfNeeded代碼。如果您支持iOS 8,請按圖所示手動加載視圖。

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.tblSearchController = UISearchController(searchResultsController: nil) 
    // etc. setup tblSearchController  
    self.tblSearchController.loadViewIfNeeded() // iOS 9 
    let _ = self.tblSearchController.view   // iOS 8 
} 

deinit { 
    self.tblSearchController.loadViewIfNeeded() // iOS 9 
    let _ = self.tblSearchController.view   // iOS 8 
} 
+1

與UIAlertView相同的錯誤。爲了解決它,不要在viewDidLoad中創建UIAlertView,在第一次使用之前創建它。謝謝@PhoneyDeveloper –

+0

這似乎已經解決了Xcode 7.3 b2和iOS 9.3 b2? – Jad

+0

我已應用相同的邏輯,但即使應用程序崩潰。似乎是iOS9中的錯誤 – Ganesh

相關問題