2011-10-17 13 views
2

initWithNibName:bundle:の中にボタンを追加しています。追加する前に初期化を開始してボタンを追加します。だから、コードviewDidLoadinitWithNibName:bundle:が終了する前に火を得る。 addSubviewの下には、viewDidLoadに依存するコードがあり、initコードが実行されていないので、クラッシュ/動作しません。initWithNibNameでaddSubviewを呼び出すと、addSubview呼び出しが実行される前に、viewDidLoad(および他のUIオブジェクトのinits)が起動されます。

viewDidLoadメソッドにボタンコードを追加したときと同じ経験をしました。 .xibにUITableViewがあり、残りのviewDidLoadが実行される前にテーブルがINITされ、tableViewが不正なデータを取得します。

ビューの初期化と読み込み時に、ビューをビューに追加するためのベストプラクティスは何ですか? Returnの前にすべてのaddSubViewを置くだけですか?

ありがとうございます!バンドル:

- (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; 
} 

答えて

4

あなたはこれがメインビューがメモリにロードされたときにビューが追加されたことを意味しますviewDidLoad内のサブビューを追加する必要があります

は、ここに私のinitWithNibNameです。私はあなたのinitWithNibName:bundle:呼び出しをカスタム初期化のために予約し、これとUIとのやり取りはしません。これはviewDidLoadのために設計されています。

テーブルビューに関しては、viewDidLoadの内部にテーブルデータソースをロードする呼び出しを行う必要があります。データソースがロードされたら、単にテーブルビューにreloadDataを呼び出して、データをテーブルビューにロードすることができます。例について

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    [self.view addSubview:saveButton]; 

    [self loadDataSource]; 

} 

- (void)loadDataSource { 

    // load datasource here 

    [self.tableView reloadData]; 

} 
+0

私はもともと同じ問題を経験していましたが、同じ問題に絞り込んでいました。私はViewDidLoadのボタンのaddSubViewを持っていましたが、ViewDidLoadの途中で私のIB TableViewがInit'edになっていました。私のViewDidLoadには、TableViewが開始される前に設定されていなかったTableViewのinitコードがありました。だから私のtableview cellForRowAtIndexPathは、ViewDidLoadのInit Codeがまだ終了していないので、Cellを返していませんでした。だから私は、ViewDidLoadの終わりにaddSubViewを置くと、viewDidLoadがTableViewを初期化するために中断される理由を知りたいのですが、助けになります。 – scooter133

0

ビューコントローラのビュープロパティへのアクセスを遅延ビューを初期化します。これにより、viewプロパティへのアクセスがinitWithNibName:に戻る前に実行される、viewDidLoadの呼び出しがトリガーされます。 viewDidLoadまたはインターフェースビルダーを使用してサブビューを追加する必要があります。

関連する問題