0

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 データのみ残ります。

4

2 に答える 2

1

通常のセグエ (アンワインド セグエ以外) は、常に新しいビュー コントローラーを作成します。したがって、アンワインド セグエ以外を使用して A に戻る場合、実際には「戻る」のではなく、新しい ViewControllerA を作成していることになります。アンワインド セグエは通常、あなたが提示しているようなケースでは使用されず、1 つのコントローラーに戻るだけですが、可能です。

この状況も、ユーザーのデフォルトを使用するのに適した場所ではありません。Appleが推奨する方法は、質問のコードで行うように、委任を使用することです。あなたが示す方法は、セグエを使用して戻るのではなく、おそらくそれを行うための最良の方法です。ただし、セグエを使用して先に進むことができます。その場合、prepareForSegue: を実装することで、自分自身をデリゲートとして設定したり、データを先に渡したりすることができます。

于 2013-02-13T19:30:30.347 に答える
1

あなたの質問は解析するのが少し難しいですが、セグエを介してパスデータを取得する方法があるかどうかを尋ねていると思います. 答えは「はい」であり、あなたが試みている回避策よりもはるかに優れています。

ボタンで次のように呼び出します。

[self performSegueWithIdentifier:@"scrollerSegue" sender:self];

これにより、以下のメソッドがトリガーされます。ここで、宛先のviewControllerにデータを設定できます。宛先のviewControllerに抽象プロパティを設定できますが、UIKit要素(ラベル、imageViewなど)はまだ存在しないため、設定できません。代わりに、プロパティを設定しviewWillAppearてから、宛先のviewControllerで、必要に応じて設定を行います。(または、データを渡す代わりに、デリゲートを設定し、デリゲートのメソッドを呼び出して、必要に応じてデータを取得することもできます)。

データを取り戻すには、デリゲートを使用してメソッドを呼び出すことが、Apple が推奨する方法のようです。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     if ([[segue identifier] isEqualToString:@"scrollerSegue"])
     {
         ScrollViewController * target = segue.destinationViewController;
         target.assetsArray = self.assetsArray;
         target.delegate = self;
     }
}
于 2013-02-13T19:37:00.070 に答える