我收到以下错误。
尝试加载视图控制器的视图
不允许解除分配并可能导致未定义的行为 ()
尝试了以下解决方案,但对我不起作用正在解除分配时尝试加载视图控制器的视图... 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))")
}
}
问题是 UISearchController 中的一个错误,它尝试在其 dealloc 方法中加载其视图。可能它调用 self.view 而作者忘记了 self.view 导致视图被加载。如果 UISearchController 已创建但尚未使用,则它不会加载其视图,就会出现此问题。在示例项目中,如果您点击搜索栏,则不会出现警告。
解决方案是强制它加载视图。在您的代码中,有两个地方可以执行此操作: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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)