UISearchController – 警告尝试加载视图控制器的视图

我收到以下错误。

尝试加载视图控制器的视图时,它是释放是不允许的,并可能导致未定义的行为()

试了下面的解决scheme,但不适合我尝试加载视图控制器的视图,而它正在释放… UISearchController

演示项目可在链接中find。

  1. 点击主控制器中的添加button,添加几个时间戳。
  2. 在主视图控制器的行之间切换,您将看到上述错误。

代码如下所示,可以在短时间内下载。

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))") } } 

问题是UISearchController中的一个错误,它试图在它的dealloc方法中加载它的视图。 可能它调用self.view,作者忘记了self.view导致视图被加载。 如果UISearchController已经创build但尚未使用,那么它不会加载它的视图,并且会发生此问题。 在您的示例项目中,如果您点击SearchBar,警告不会出现。

解决办法是强制它加载它的视图。 在你的代码中有两个地方可以做到这一点:viewDidLoad()或deinit。 使用其中一个build议的行(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 } 

我看到这个问题,只有IOS9,也注意到这个错误报告http://www.openradar.me/22250107 。 目前看来目前还没有解决办法。