首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在initWithNibName中调用addSubview :导致在执行addSubview调用之前触发viewDidLoad (和其他UI对象初始化

在initWithNibName中调用addSubview :导致在执行addSubview调用之前触发viewDidLoad (和其他UI对象初始化
EN

Stack Overflow用户
提问于 2011-10-18 04:39:33
回答 2查看 1.9K关注 0票数 2

我在我的initWithNibName:bundle:中间添加了一个按钮,当我将按钮视图添加到self.view中时,视图在添加按钮之前开始初始化。因此,在initWithNibName:bundle:完成之前,viewDidLoad中的代码就会触发。在viewDidLoad中依赖的addSubview下面有代码,会导致它崩溃/不工作,因为初始化代码还没有运行。

当我将按钮代码添加到viewDidLoad方法中时,我也有过同样的经历。.xib中有一个UITableView,表在viewDidLoad的其余部分运行之前被初始化,并导致tableView获得错误数据。

在初始化和加载视图时,将视图添加到视图的最佳实践是什么?只是把所有的addSubViews放在返回之前?

谢谢!

下面是我的initWithNibName:bundle:

代码语言:javascript
运行
复制
- (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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-18 04:56:49

您应该在viewDidLoad中添加子视图,这意味着在将主视图加载到内存中时会添加这些视图。我将保留您的initWithNibName:bundle:调用用于自定义初始化,而不是与UI交互,因为viewDidLoad就是为此而设计的。

对于您的tableView,您应该在viewDidLoad中放一个调用来装入tables数据源。加载数据源后,只需在表视图上调用reloadData,即可将数据加载到表视图中。

例如:

代码语言:javascript
运行
复制
- (void)viewDidLoad
{

    [super viewDidLoad];

    [self.view addSubview:saveButton];

    [self loadDataSource];

}

- (void)loadDataSource {

  // load datasource here

  [self.tableView reloadData];

}
票数 4
EN

Stack Overflow用户

发布于 2011-10-18 05:02:25

对视图控制器的view属性的任何访问都会延迟初始化视图。这将触发对viewDidLoad的调用,该调用将在对视图属性的访问返回到initWithNibName:之前执行。您应该在viewDidLoad中或使用接口构建器添加子视图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7799306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档