ViewControllerA に UILabel があり、ViewControllerB に UITextField があるとします。ViewControllerB に移動してテキストを入力し、ボタンを押して ViewControllerA に戻りたいと思います。UILabel は、UITextField に入力されたものを読み取る必要があります。
NSUserDefaults を使用し、委任も使用して、上記を達成できました。これを行うためにストーリーボードを使用しています。私の質問は、絵コンテで使用されるセグエについてです。
委任を使用する場合、コードを使用してストーリーボードに出入りする必要があり、データを転送するためにビューコントローラーをセグエに視覚的に接続しないようです。ViewController A のボタンを押したときのコードは次のとおりです。
- (IBAction)pressFirstButton:(id)sender {
UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
RBViewController2 *vc2 = [sb instantiateViewControllerWithIdentifier:@"ViewController2"];
[vc2 setDelegate:self];
[self presentViewController:vc2 animated:YES completion:NULL];
}
ViewControllerB から ViewControllerA にデータを戻すときは、次のようにします。
- (IBAction)buttonSegueBackTo1:(id)sender {
NSString *sendThis = self.textFieldVC2.text;
[self.delegate passTextFieldInput:sendThis];
[self dismissViewControllerAnimated:YES completion:NULL];
}
ビュー コントローラ間にセグエは描画されておらず、すべて正常に動作しています。これと同じコードを書かずにセグエを描画すると、データは逆方向に渡されません。ただし、NSUserDefaults を使用してこのようなデータを渡そうとすると、View Controller との間でやり取りするコードを記述する必要はありません。代わりに、View Controller を描画されたセグエに接続するだけです。奇妙なことに、ビュー コントローラーを手動でコーディングする (セグエを描画しない) ときに NSUserDefaults を使用してデータを渡そうとすると、データは転送されません。
-(IBAction) pressFirstButton:(id) 送信者メソッドでコードを記述する代わりに、コードを prepareForSegue メソッドに入れる必要があるのではないかと考えています。
私の質問は、描画されたセグエによってデータが失われることがあるのはなぜですか? すべての委任は、引かれたセグエなしで行う必要がありますか? NSUserDefaults がセグエを適切に転送する必要があり、委任がコードを適切に転送する必要がある場合、両方を必要とするビューがある場合、NSUserDefaults は、使用されている手動セグエがビューを「リセット」し、NSUserDefaults データのみ残ります。