我可以猜测这里可能出现了什么问题,因为我也遇到过:
我发现当我添加初始化代码到loadView时,经常会出现无限堆栈跟踪。
不要在-loadView中读取self.view。只是设置它,不要获取它。
如果视图当前未加载,则self.view属性访问器调用-loadView。这就是无限递归的原因。
-loadView中以编程方式构建视图的通常方法,如Apple的预接口生成器示例所示,更像是这样:
UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];
我不会因为你没有使用Interface Builder而责备你。我一直坚持使用这种方法,对于处理IB的复杂性、界面怪异和意想不到的幕后行为,我感到更加舒适。
loadView
是UIViewController
中的方法,它实际上会加载视图并将其分配给view
属性。如果您想要编程设置view
属性,那么UIViewController
的子类也可以覆盖此位置。
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];
}
- (void) loadView {
[super loadview];
// init code here...
[self.view addSubView:mySubview1]; //etc..
}
[super loadView]
,虽然在示例中有相反的例子,但我认为文档是正确的(我在过去发现了许多示例中的错误)。对于 UITableViewController 等,需要使用 [super loadView]
。但是!任何加载后的设置(例如添加额外的子视图)应在 viewDidLoad 中完成。 - Ivan Vučica-(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];
}
loadView()
当你的控制器被要求创建其 self.view
时调用。您可以自己完成它,例如:
self.view = [UIView alloc] init...];
-loadView()
的方法,它将self.view初始化为空白视图。然后你可以调用[super loadView];
Apple 在 viewDidLoad 中所给的定义是指在控制器的视图被加载到内存后进行调用。简单来说,这是第一个会被加载的方法。
你可能会想在什么情况下这个方法会被充分利用?答案是,基本上你想让应用程序首先加载的任何内容都可以使用它。例如,你可能想要不同的背景颜色,而不是白色,你可以选择蓝色。
-(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v; }
- user2054339