在iPhone应用程序中使用视图和视图控制器时,是否可以解释loadView和viewDidLoad之间的区别?
我的个人情境是,我是从代码构建我的所有视图,我不会,也不会使用Interface Builder,如果这有任何区别。
我发现通常当我向loadView添加init代码时,我最终会得到一个无限的堆栈跟踪,所以我通常会在viewDidLoad中完成所有的子视图构建......但是每次获取时我都不清楚执行,以及放置init代码的更合适的地方是什么。什么是完美的,是一个简单的初始化调用图。
谢谢!
答案 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)
loadView
是UIViewController
中实际加载视图并将其分配给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上给出的定义提到,在将控制器的视图加载到内存后调用该定义。简而言之,这是第一个加载的方法。
您可能正在考虑在什么条件下可以充分利用此方法?答案是,基本上您希望应用程序首先加载。例如,您可能想要不同的背景颜色,而不是白色,您可能选择蓝色。