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

Posted

技术标签:

【中文标题】UISearchController - 警告尝试加载视图控制器的视图【英文标题】:UISearchController - Warning Attempting to load the view of a view controller 【发布时间】:2015-09-20 02:02:39 【问题描述】:

我收到以下错误。

尝试加载视图控制器的视图 不允许解除分配,可能会导致未定义的行为 ()

尝试了以下解决方案,但对我不起作用Attempting to load the view of a view controller while it is deallocating... UISearchController

链接中提供了一个演示项目。

    点击主控制器中的添加按钮,添加几个时间戳。 在主视图控制器的行之间切换,你会看到上面的错误。

代码如下所示,可从简写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))")
    

【问题讨论】:

这可能无法解决问题,但最好调用sizeToFit()然后将搜索栏放入您的界面。 我也有同样的问题。如果您找到解决方案,请发布。 【参考方案1】:

问题是 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

【讨论】:

与 UIAlertView 相同的错误。要解决它,请不要在 viewDidLoad 中创建 UIAlertView,而是在第一次使用之前创建它。谢谢@PhoneyDeveloper 这似乎已在 Xcode 7.3 b2 和 iOS 9.3 b2 中修复? 我应用了相同的逻辑,但即使应用程序崩溃了。似乎是它在iOS9中的错误【参考方案2】:

我也看到了同样的问题,仅限 IOS9,还请注意此错误报告 http://www.openradar.me/22250107。目前看来没有解决办法。

【讨论】:

以上是关于UISearchController - 警告尝试加载视图控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章

警告:尝试在已呈现 <UISearchController: 0x142a1f7c0> 的 * 上呈现视图控制器

如何在使用 popViewControllerAnimated(true) 导航出 UITableView 时修复 UISearchController 的警告

UISearchController 与 UITableView?

警告:尝试在已呈现的*上显示View Controller

尝试在 Swift 5 中设置 UISearchController 的背景颜色

UISearchController禁用取消按钮[重复]