在initWithNibName中调用addSubview:导致viewDidLoad(和其他UI Object inits)在addSubview Call执行之前触发

时间:2011-10-17 20:39:33

标签: objective-c init viewdidload addsubview

我在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;
}

2 个答案:

答案 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中添加子视图或使用界面构建器。