iPhone SDK:loadView和viewDidLoad有什么区别?

时间:2009-02-21 23:52:12

标签: ios objective-c iphone uiview

在iPhone应用程序中使用视图和视图控制器时,是否可以解释loadView和viewDidLoad之间的区别?

我的个人情境是,我是从代码构建我的所有视图,我不会,也不会使用Interface Builder,如果这有任何区别。

我发现通常当我向loadView添加init代码时,我最终会得到一个无限的堆栈跟踪,所以我通常会在viewDidLoad中完成所有的子视图构建......但是每次获取时我都不清楚执行,以及放置init代码的更合适的地方是什么。什么是完美的,是一个简单的初始化调用图。

谢谢!

8 个答案:

答案 0 :(得分:199)

我可以猜到这里可能存在什么问题,因为我已经做到了:

  

我发现通常当我向loadView添加init代码时,我最终会得到无限的堆栈跟踪

请勿在-loadView中阅读self.view。设置,不要获取

如果当前未加载视图,则self.view属性访问者调用 -loadView。你的无限递归。

在Apple的pre-Interface-Example示例中演示的在-loadView中以编程方式构建视图的常用方法更像是:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

我不会责怪你不使用IB。我已经坚持使用这种方法为所有Instapaper而且发现自己比处理IB的复杂性,界面怪癖和意外的幕后行为更加舒服。

答案 1 :(得分:43)

loadViewUIViewController中实际加载视图并将其分配给view属性的方法。如果您想以编程方式设置UIViewController属性,那么这也是view的子类将覆盖的位置。

viewDidLoad是加载视图后调用的方法。在调用loadView之后调用它。在这里,您可以覆盖并插入代码,以便在视图加载后对视图进行进一步的初始设置。

答案 2 :(得分:13)

viewDidLoad()
当您从NIB加载视图并希望在启动后执行任何自定义

时,将使用

LoadView()
如果要以编程方式创建视图(不使用Interface Builder)

,则使用

答案 3 :(得分:11)

只需添加一些代码示例来演示NilObject所说的内容:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}

答案 4 :(得分:2)

为了防止在读取self.view时发生无限循环,请在加载视图时调用类的超级实现。超级实现将为您分配一个新的UIView。

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}

答案 5 :(得分:1)

使用loadView最简单的方法是创建一些类型的基本视图控制器,比如MyBaseViewController,它是UIViewController的子类。在它的loadView方法中以这种方式创建视图:

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

当你需要制作一些视图控制器时,你只需使用MyBaseViewController的子类,在它的loadView控制器中你只需要像这样调用[super loadView]

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}

答案 6 :(得分:1)

当您的控制器被要求创建其loadView()时,会调用

self.view。你可以自己做,如

self.view = [UIView alloc] init...];

或者你的控制器的父UIController类已经有一个方法名-loadView(),它将你的self.view初始化为空白视图。然后你可以打电话

[super loadView];

我真的推荐第二种方法,因为它鼓励继承。仅当您的视图控制器不直接从UIViewController继承时。

答案 7 :(得分:0)

Apple在viewDidLoad上给出的定义提到,在将控制器的视图加载到内存后调用该定义。简而言之,这是第一个加载的方法。

您可能正在考虑在什么条件下可以充分利用此方法?答案是,基本上您希望应用程序首先加载。例如,您可能想要不同的背景颜色,而不是白色,您可能选择蓝色。