最も簡単な方法を使用して、子ビュー コントローラーから親 VC にデータ (文字列) を渡します。私はいくつかの方法を試しましたが、迷子になりました。誰かが私に最善の方法を教えてくれますか.
2 に答える
スリカントは正しいです。ビュー コントローラー (「最初の」ビュー コントローラー) から別のビュー コントローラー (「2 番目の」ビュー コントローラー) へのセグエがある場合、最初のビュー コントローラーを指すプロパティを 2 番目のビュー コントローラーに作成するだけです。トランジションを実行する前に、最初のView Controllerにそのポインターを設定してもらいます。これが完了すると、2 番目のコントローラーは、最初のコントローラーのプロパティを更新したり、メソッドを呼び出したりすることができます。
詳細については、ビュー コントローラー プログラミング ガイドのセグエがトリガーされたときの宛先コントローラーの構成を参照してください。. 次に、Srikanth が言うように、2 番目のコントローラーはそのポインターを使用して、最初のコントローラーのプロパティを更新できます。prepareForSegue
weak
したがって、2 番目のビュー コントローラーには、最初のビュー コントローラーを指すプロパティ (慎重に注意してください) があります。
SecondViewController.h で:
@class FirstViewController;
@interface SecondViewController : UIViewController
@property (nonatomic, weak) FirstViewController *firstViewController;
@end
次に、FirstViewController.m で:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"YourSegueIdentifierHere"])
{
[segue.destinationViewController setFirstViewController:self];
}
}
たとえば、最初のView Controllerに次のプロパティがあるとしますfavoriteColor
。
@interface FirstViewController : UIViewController
@property (nonatomic, strong) NSString *favoriteColor;
@end
次に、2 番目のビュー コントローラーはそのプロパティを使用して、次のようにfirstViewController
this を更新できます。favoriteColor
self.firstViewController.favoriteColor = @"Blue";
明らかに:
FirstViewController
andSecondViewController
を適切なクラス名に置き換えます。#import
2 番目のビュー コントローラーの .m ファイルが最初のビュー コントローラーの .h を実行することを確認してください。と最初のコントローラーから 2 番目のコントローラーへのセグエに対して Interface Builder でセグエ識別子を指定したことを確認し、上記を調整して、識別子
prepareForSegue
に置き換えます。YourSegueIdentifierHere
iOS 6 では、アンワインド セグエを介してこれを実現することもできます。prepareForSegue
2 番目のビュー コントローラーで、アンワインド セグエの宛先コントローラー (つまり、最初のコントローラー) のプロパティを更新するだけです。素晴らしいのは、セグエの巻き戻しが任意の数のレベルに戻ることができることです。そのため、より複雑なシナリオでは非常に便利です。ただし、iOS 6 以降のみです。
セグエのアンワインドを行うには、最初のビュー コントローラー (IBAction
戻り値の型とUIStoryboardSegue
パラメーターの組み合わせによって識別される) でアンワインド アクションを定義する必要があります。次に例を示します。
- (IBAction)done:(UIStoryboardSegue *)segue
{
// do any clean up you want
}
次に、2 番目 (または 3 番目または ...) のビュー コントローラーはcontrol、Interface Builder でボタンからシーンのドックの終了アイコンにドラッグすることで、アンワインド セグエを作成できます。巻き戻し元のコントローラーに論理的な処理をさせて、prepareForSegue
情報を最初のビュー コントローラーに戻すことができます。
ところで、あなたは「親」と「子」という用語を使用しましたが、ビュー コントローラーが他のビューを呼び出しているビューコントローラー コンテインメントのより高度なトピックについて話しているのではないことを明確にしたかったのです。コントローラーを使用して、(アプリ内の異なるシーン間の遷移とは対照的に) 情報の単一画面の表示を容易にします。以下のコメントで rdelmar が指摘しているように、「親」および「子」コントローラーという用語は、厳密に言えば、View Controller コンテインメントを使用していることをより適切に意味します。
明らかに、View Controller コンテインメントを使用している場合、セグエprepareForSegue
などの議論は当てはまらないことは明らかです。さらに、適切に実装されたコンテナー ビュー コントローラーは、親を参照する独自のプロパティを定義する必要なく、子コントローラーが のUIViewController
プロパティを実際に使用できることを保証します。parentViewController
適切なサブクラスになるようにキャスト/定義parentViewController
するだけで、サブクラス化されたプロパティに非常に簡単にアクセスできます。
最善の方法は、タイプ id または UIViewController の子ビュー コントローラーにプロパティを設定することです。子を作成するときに、その値を親View Controllerに設定します。
子View Controllerで親View Controllerにアクセスすると、そのメソッドまたはプロパティにアクセスできます。