我在initWithNibName:bundle:
的中间添加了一个按钮,当我将按钮视图添加到self.view时,视图会在添加按钮之前开始初始化。因此viewDidLoad
中的代码会在initWithNibName:bundle:
完成之前触发。 addSubview下面的代码依赖于viewDidLoad
并导致它崩溃/无法工作,因为init代码尚未运行。
当我将按钮代码添加到viewDidLoad
方法时,我获得了相同的体验。 .xib中有一个UITableView,并且该表在viewDidLoad的其余部分运行之前被引入并导致tableView获取错误数据。
在启动和加载视图时向视图添加视图的最佳做法是什么?只需将所有addSubViews放在Return?
之前谢谢!
这是我的initWithNibName:bundle:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nil];
[self setIoUIDebug:(IoUIDebugSelectorNames)];
if (IoUIDebug & IoUIDebugSelectorNames) {
NSLog(@"%@ - %@", [self description], NSStringFromSelector(_cmd) );
}
CGRect frame = CGRectMake(20, 521, 500, 37);
saveButton = [UIButton newButtonWithTitle:NSLocalizedStringFromTable(@"Save Animation Label",@"ScreenEditor",@"Save Animation Label")
target:self
selector:@selector(saveButtonPressedAction:)
frame:frame
image:[UIImage imageNamed:@"BlueButtonSmall.png"]
imagePressed:[UIImage imageNamed:@"BlueButtonSmallPressed.png"]
darkTextColor:NO];
[self.view addSubview:saveButton]; // <- Right here I'll hit breakpoints in other parts of viewDidLoad and cellForRowAtIndexPath, before the lined below get executed.
[saveButton setEnabled: NO];
[saveButton setUserInteractionEnabled: NO];
newAnimation = nil;
selectedSysCDAnimation = nil;
selectedIoCDTag = nil;
animationSaved = NO;
return self;
}
答案 0 :(得分:4)
您应该在viewDidLoad
内添加子视图,这意味着在将主视图加载到内存时添加视图。我会保留initWithNibName:bundle:
调用自定义初始化而不与用户界面进行交互,因为这是viewDidLoad
的设计目标。
关于tableView,您应该调用加载viewDidLoad
内的表数据源。加载数据源后,您只需在tableview上调用reloadData
即可将数据加载到tableview中。
例如:
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:saveButton];
[self loadDataSource];
}
- (void)loadDataSource {
// load datasource here
[self.tableView reloadData];
}
答案 1 :(得分:0)
对视图控制器的view属性的任何访问都将懒惰地初始化视图。这将触发对viewDidLoad的调用,该调用将在对initWithNibName:中的view属性的访问权限返回之前执行。您应该在viewDidLoad中添加子视图或使用界面构建器。