我刚刚遇到了一些我以前没见过的东西,我想我会在这里要求核实原因。我有一个UIController谁的视图是以编程方式定义的,我今天注意到当我从其loadView中注释掉代码(以测试其他东西)时,loadView和viewDidLoad都被调用了四次。我的想法是因为我没有设置视图属性iOS尝试多次加载视图,虽然我仍然有点好奇,如果这也是为什么viewDidLoad也被调用。
- (void)loadView {
NSLog(@"%s", __PRETTY_FUNCTION__);
// MAP VIEW
// MKMapView *tempMapView = [[MKMapView alloc] init];
// [tempMapView setDelegate:self];
// [self setView:tempMapView];
// [self setCustomMapView:tempMapView];
// [tempMapView release];
}
控制台输出:
2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView]
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad]
2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView]
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad]
2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView]
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad]
2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView]
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad]
答案 0 :(得分:9)
在loadView方法的开头添加[super loadView]
答案 1 :(得分:2)
将您的代码放在viewDidLoad中,并注释loadView方法
答案 2 :(得分:1)
我认为这里有两点。首先,我认为你的假设是正确的,因为任何调用视图的方法都是nil,因此再次请求视图控制器的视图。这导致它按照documentation for UIViewController中-loadView
的文档记录-view
。
为什么-viewDidLoad
之后被调用,即使它没有加载视图;我想在调用-loadView
的地方,假设已加载视图并在之后直接调用-viewDidLoad
。
无论哪种方式,如果您自己实施-loadView
,您必须在其末尾有一个有效的视图。
答案 3 :(得分:1)
您对loadView
的覆盖必须为self.view
分配视图。
- (void)loadView
{
self.view = [UIView new];
}
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
的每个文档您可以覆盖此方法以手动创建视图。如果选择这样做,请将视图层次结构的根视图分配给 视图 属性。您创建的视图应该是唯一的实例,不应与任何其他视图控制器对象共享。您对此方法的自定义实现不应调用super。
据推测,UIKit内部有几个地方可以调用类似的内容:
if (viewController.view == nil) {
[viewController loadView];
}