Answers:
我猜这里可能是问题所在,因为我已经做到了:
我发现,通常当我将初始化代码添加到loadView时,最终都会得到无限的堆栈跟踪
不要在-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的复杂性,界面怪癖和意外的幕后行为要舒服得多。
-(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v;
只需添加一些代码示例来演示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];
}
为了防止在读取self.view时发生无限循环,请在加载视图时调用该类的super实现。超级实现将为您分配一个新的UIView。
- (void) loadView {
[super loadview];
// init code here...
[self.view addSubView:mySubview1]; //etc..
}
[super loadView];
。在示例中这是矛盾的,但是我认为文档说得很对(随着时间的推移,我在示例中发现了许多错误)。[super loadView]
但是,UITableViewController等需要。然而!任何后加载设置(例如,添加额外的子视图)都应在viewDidLoad中完成。
使用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];
}