在iPhone应用程序中使用视图和视图控制器时,任何人都可以解释loadView和viewDidLoad之间的区别吗?
我个人的背景是,我从代码构建我的所有视图,我不会,也不会使用Interface Builder,如果这有任何区别.
我发现通常当我将初始化代码添加到loadView时,我最终会得到一个无限的堆栈跟踪,所以我通常在viewDidLoad中完成所有的子视图构建...但是每次执行时我都不清楚它,并且什么是更适合放置init代码的地方.什么是完美的,是一个简单的初始化调用图.
谢谢!
我猜这可能是什么问题,因为我已经做到了:
我发现通常当我向loadView添加init代码时,我最终得到了无限的堆栈跟踪
不要在-loadView中读取self.view.只设置它,不要得到它.
如果当前未加载视图,则self.view 属性访问器调用 -loadView.你的无限递归.
在Apple的pre-Interface-Builder示例中演示的在-loadView中以编程方式构建视图的常用方法更像是:
UIView *view = [[UIView alloc] init...]; ... [view addSubview:whatever]; [view addSubview:whatever2]; ... self.view = view; [view release];
而且我不会责怪你不使用IB.我已经坚持使用这种方法为所有Instapaper而且发现自己比处理IB的复杂性,界面怪癖和意外的幕后行为更加舒服.
loadView
是UIViewController
实际加载视图并将其分配给view
属性的方法.UIViewController
如果您想以编程方式设置view
属性,这也是将覆盖的子类的位置.
viewDidLoad
是加载视图后调用的方法.在调用loadView之后调用它.在这里,您可以覆盖并插入代码,以便在加载视图后对视图进行进一步的初始设置.
viewDidLoad()
从NIB加载视图并希望在启动后执行任何自定义时使用
LoadView()
要以编程方式创建视图时使用(不使用Interface Builder)
只需添加一些代码示例来演示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]; }