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