私のアプリでは、ストーリーボードとセグエを使用しています。次のように、セグエを実行する前に宛先のビュー コントローラーにデータを渡すことがよくあります。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
1 か所を除いてどこでも機能します。セレクターが呼び出され、データが設定されますが、セグエが完了して宛先コントローラーが表示されると、設定したばかりのデータがありません。ソースと宛先の両方のView ControllerでView ControllerのIDを出力した後、segue.destinationViewController
上記のコードは、表示されるものとは異なるView Controllerのインスタンスであることがわかりました。何が起きてる?
[UPDATE 1]
宛先ビューコントローラーのライフサイクルを調べたところ、セグエの実行中に最初にロードされましたが、プロパティを設定した後です! これは、私がそれを呼び出しperformSelector
たときに、View Controller オブジェクトが初期化されていないことを意味します! これが、設定したデータが固執しない理由です。なぜこれが当てはまるのか、なぜこの同じアプローチが私のアプリの他の部分で機能するのか理解できません。
[UPDATE 2]setMyData
リクエストによる
コードの投稿。locationToOpen
はパブリック プロパティであるため、最初はこのメソッドをまったく持っていませんでした。確実に呼び出され、デバッグ情報を出力するために追加しただけです。
- (void)setMyData:(MyData *)myData
{
DLog(@"self: %@", (id)self);
_myData = myData;
}