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?