[Ios] 正确使用loadView和viewDidLoad与UIViewController没有nibs / xibs



Answers

Firoze Lafeer的回答是正确的,我只是想展示如何强制加载视图属性的正确方法

(void)self.view;

你不应该这样做! 如果你必须,你做错了什么,但不要在任何情况下调用-loadView-viewDidLoad

Question

当我没有笔尖编程时,我的印象是我需要调用loadView来初始化我的视图,如下所示:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        // Custom initialization
        [self loadView];
    }
    return self;
}

(我已经设置了nibNameOrNil = nil,因为没有nib。)

然后,我建立了这样的观点:

- (void) loadView {
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];
    [self viewDidLoad];
}

这是做viewDidLoad中的一切。

我仍然不确定是否应该以这种方式调用loadView和viewDidLoad。 他们没有自动调用。

令人困惑的是在UIViewController类的参考文档中:

loadView讨论

你不应该直接调用这个方法。 视图控制器在请求视图属性时调用此方法,但当前为零。 如果您手动创建视图,则必须重写此方法并使用它来创建视图。 如果使用Interface Builder创建视图并初始化视图控制器,即使用initWithNibName:bundle:方法初始化视图,则直接设置nibName和nibBundle属性,或者在Interface Builder中创建视图和视图控制器 - 那么你不能重写这个方法。

所以,我不明白如果我不应该直接调用它loadView被调用。

此方法的默认实现查找有效的笔尖信息,并使用该信息加载关联的笔尖文件。 如果没有指定nib信息,则默认实现将创建一个普通的UIView对象,并使其成为主视图。

我不明白这是如何工作 - 创建一个痛苦的UIView。

如果您为了手动创建视图而重写此方法,则应该这样做,并将层次结构的根视图分配给视图属性。 (您创建的视图应该是唯一的实例,不应该与任何其他视图控制器对象共享。)您自定义的此方法的实现不应该调用super。

如果您想对视图执行任何额外的初始化,请在viewDidLoad方法中执行此操作。 在iOS 3.0及更高版本中,您还应该重写viewDidUnload方法以释放对视图或其内容的任何引用。

好吧,到目前为止,并没有说如何调用viewDidLoad。 所以对于viewDidLoad:

viewDidLoad讨论

在视图控制器将相关视图加载到内存之后调用此方法无论视图是存储在nib文件中还是以编程方式在loadView方法中创建, 都会调用此方法。 此方法最常用于对从nib文件加载的视图执行附加的初始化步骤。

叫什么?

由于这些方法在我的代码中没有被自动调用,我只能认为我必须自己调用它们。 但是我仍然没有从文件中得到清楚的理解,这是正确的。