相关疑难解决方法(0)

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

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

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

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

然后,我设置了视图,如下所示:

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

这是在viewDidLoad中执行的所有操作.

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

令人困惑的是UIViewController类引用的文档:

loadView讨论

你永远不应该直接调用这个方法.视图控制器在请求视图属性时调用此方法,但当前为nil. 如果手动创建视图,则必须覆盖此方法并使用它来创建视图.如果使用Interface Builder创建视图并初始化视图控制器 - 也就是说,使用initWithNibName:bundle:方法初始化视图,直接设置nibName和nibBundle属性,或者在Interface Builder中创建视图和视图控制器 - 那么你不能覆盖这个方法.

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

此方法的默认实现查找有效的nib信息,并使用该信息加载关联的nib文件. 如果未指定nib信息,则默认实现会创建纯UIView对象并使其成为主视图.

我不明白它是如何工作的 - 创造一种痛苦的UIView.

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

如果要对视图执行任何其他初始化,请在viewDidLoad方法中执行此操作.在iOS 3.0及更高版本中,您还应覆盖viewDidUnload方法以释放对视图或其内容的任何引用.

好的,到目前为止它没有说明如何调用viewDidLoad.所以对于viewDidLoad:

viewDidLoad讨论

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

叫什么?

由于我的代码中没有自动调用这些方法,因此我认为我必须自己调用它们.但我仍然没有从文档中得到明确的理解,这是正确的做法.

cocoa-touch uiviewcontroller ios

26
推荐指数
2
解决办法
2万
查看次数

标签 统计

cocoa-touch ×1

ios ×1

uiviewcontroller ×1