セグエを使用する私のプロジェクトでは、次のようにしました (私は iOS に慣れていないので、おそらく「より良い」方法があることに注意してください。iOS のベテランには明らかかもしれません)。
短いバージョン: モーダル ビュー コントローラーの.h
ファイルでコールバック プロトコルを定義します。モーダル ビュー コントローラーが閉じると、プレゼンターがそのプロトコルを実装しているかどうかを確認し、それらのメソッドを呼び出してデータを渡します。
あなたが言ったように、モーダル ビュー コントローラーがユーザーから単一の文字列値を収集し、[OK] または [キャンセル] をクリックするとします。そのクラスは次のようになります。
@interface MyModalViewController : UIViewController
...
@end
次のようなプロトコルを同じヘッダーに追加することをお勧めします。
@protocol MyModalViewControllerCallback
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc;
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
withInput:(NSString*)s;
@end
次に、次のようなwith コードMyModalViewController.m
を追加します。viewDidDisappear
-(void) viewDidDisappear:(BOOL)animated {
UIViewController* presenter = self.presentingViewController;
// If the presenter is a UINavigationController then we assume that we're
// notifying whichever UIViewController is on the top of the stack.
if ([presenter isKindOfClass:[UINavigationController class]]) {
presenter = [(UINavigationController*)presenter topViewController];
}
if ([presenter conformsToProtocol:@protocol(MyModalViewControllerCallback)]) {
// Assumes the presence of an "accepted" ivar that knows whether they
// accepted or cancelled, and a "data" ivar that has the data that the
// user entered.
if (accepted) {
[presenter userAcceptedMyModalViewController:self withInput:data];
}
else {
[presenter userCancelledMyModalViewController:self];
}
}
[super viewDidDisappear:animated];
}
そして最後に、親ビューで@protocol
、たとえば次のように new を実装し.h
ます。
@interface MyParentViewController : UIViewController <MyModalViewControllerCallback>
...
@end
とで.m
:
@implementation MyParentViewController
...
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc {
// Update the text field with something like "They clicked cancel!"
}
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
withInput:(NSString*)s {
// Update the text field with the value in s
}
...
@end