当view属性没有设置时,loadView多次调用?

时间:2011-02-02 14:23:44

标签: iphone objective-c cocoa-touch

我刚刚遇到了一些我以前没见过的东西,我想我会在这里要求核实原因。我有一个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]

4 个答案:

答案 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];
}
相关问题