我使用Xcode 6&#39} Master Detail Application
模板创建了一个新的iOS 8项目。我没有以任何方式更改代码。
在DetailViewController.m
中设置断点并检查self.splitViewController
属性时,如下面的屏幕截图所示,它返回nil
。
为什么?
根据Apple UISplitViewController Documentation,self.splitViewController
应该返回最近的SplitViewController
:
如果接收者或其祖先之一是分裂视图的孩子 controller,此属性包含拥有的拆分视图控制器。 如果视图控制器未嵌入到a中,则此属性为nil 拆分视图控制器。
答案 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>