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

NNi*_*ikN 11 ios swift uisearchcontroller

我收到以下错误.

尝试在取消分配时加载视图控制器的视图是不允许的,并且可能导致未定义的行为()

尝试了以下解决方案,但对我不起作用尝试在取消分配时加载视图控制器的视图... UISearchController

该链接提供了一个演示项目.

  1. 点击主控制器中的添加按钮,添加几个时间戳.
  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))")
    }
}
Run Code Online (Sandbox Code Playgroud)

Pho*_*per 31

问题是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
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rke 6

我看到同样的问题,仅限IOS9,并且还注意到这个错误报告http://www.openradar.me/22250107.目前似乎没有解决方案.