为什么self.splitViewController == nil?

时间:2014-12-29 20:12:37

标签: ios objective-c uiviewcontroller ios8 uisplitviewcontroller

我使用Xcode 6&#39} Master Detail Application模板创建了一个新的iOS 8项目。我没有以任何方式更改代码。

DetailViewController.m中设置断点并检查self.splitViewController属性时,如下面的屏幕截图所示,它返回nil

enter image description here

为什么?

根据Apple UISplitViewController Documentationself.splitViewController应该返回最近的SplitViewController

  

如果接收者或其祖先之一是分裂视图的孩子   controller,此属性包含拥有的拆分视图控制器。   如果视图控制器未嵌入到a中,则此属性为nil   拆分视图控制器。

2 个答案:

答案 0 :(得分:6)

不知道你是否想过这个,但我刚遇到这个问题并发现了什么错误,看起来与你的情况类似。

在viewDidLoad之后才会配置splitViewController属性。如果不经意,您使用它的代码会在viewDidLoad之前被触发,那么该值将为nil。

我在你的代码示例中注意到configureView是从setDetailItem调用的。如果这是从prepareForSegue调用的,那么viewDidLoad将不会发生,导致configureView中的splitViewController属性值为nil。所以代码必须在[super viewDidLoad]完成之后运行。

答案 1 :(得分:0)

模板中的setDetailItem缺少对isViewLoaded的关键检查:

- (void)setDetailItem:(Event *)detailItem {
    if (_detailItem == detailItem) {
        return;
    }
    _detailItem = detailItem;

    if(self.isViewLoaded){
        // Update the view.
        [self configureView];
    }
}

如果您在configureView内使用self.view进行某些操作,则可以在需要加载的东西为零时在加载视图之前(例如在prepareForSegue中)设置细节,并且还可以防止意外加载视图。 / p>