我得到"意外地发现nil,同时打开一个Optional值"因为在我的代码中,我试图在初始化之前为webview赋值。我正在尝试从Master转换为Detail视图控制器。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
let controller = (segue.destinationViewController as UINavigationController).topViewController as DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
详情查看代码:
var detailItem: AnyObject? {
didSet {
// Update the view.
self.configureView()
}
}
func configureView() {
// Update the user interface for the detail item.
if let detailContent = detailItem?.valueForKey("content") as? String{
self.webView.loadHTMLString(detailContent as String, baseURL:nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.configureView()
}
它失败了因为我的Webview在Nil。如何解决我的插座在设置时未初始化的情况。
请帮忙。 感谢。
答案 0 :(得分:1)
停下来思考事情发生的顺序:
prepareForSegue
- 目标视图控制器存在,但全部都存在。它没有视野,它的出口没有设置。您可以设置其非出口属性,但这样就可以做到。
segue开始发生。
目标视图控制器获取viewDidLoad
。 现在它有一个视图,其出口已设置。
segue完成,目标视图控制器获得viewWillAppear:
以及之后的viewDidAppear:
。现在它的视图实际上在界面中。
很明显,您不能允许configureView
假设 Web视图存在,因为第一次调用它时,即在prepareForSegue
中,不会&# 39; t 存在。 configureView
需要明确测试self.webView
是否为零,如果是,则不应该执行任何操作:
func configureView() {
// Update the user interface for the detail item.
if self.webView == nil { return } // no web view, bail out
if let detailContent = detailItem?.valueForKey("content") as? String{
self.webView.loadHTMLString(detailContent as String, baseURL:nil)
}
}
在那之后,一切都会好起来的。随后会调用viewDidLoad
,configureView
将再次调用 - 此时间,detailItem
和网络视图都存在所以一切都会好的。