详细信息视图控制器从主视图控制器转换

时间:2015-04-10 01:49:25

标签: swift

我得到"意外地发现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。如何解决我的插座在设置时未初始化的情况。

请帮忙。 感谢。

1 个答案:

答案 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)
    }
}

在那之后,一切都会好起来的。随后会调用viewDidLoadconfigureView将再次调用 - 时间,detailItem和网络视图都存在所以一切都会好的。