0

ストーリーボードに構築したviewControllerがあります。また、API リクエストとレスポンスを送信およびリッスンするモデルとして機能する NSObject サブクラスもあります。モデルでメソッドが起動すると、その時点でたまたま表示されているビューから、viewController のモーダル ビューを表示したいと考えています。

例として、API が「このビューを表示」と聞いた場合、表示されているビューに関係なく、viewController を表示したいとします。

概念的には、これをどのように行うのでしょうか?

編集: モーダル ビュー コントローラーを表示するときに、どのビュー コントローラーが表示されるかわかりません。また、提示されたときに、モデルから modalVC にパラメータを渡す必要があります。

4

2 に答える 2

2

モデルから、ビューを表示する必要があることを「誰か」に伝える通知を送信します。

NSDictionary *userInfo = @{ @"TheViewKey": viewToDisplay];
[[NSNoticationCenter defaultCenter] postNotificationName:@"NotificationThatThisViewNeedsToBeDisplayed" object:self userInfo:userInfo];

次に、デリゲート (またはアクティブなビュー コントローラー) でこの通知に登録し、表示を処理します。

// self is the delegate and/or the view controller that will receive the notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleViewToDisplay:) name:@"NotificationThatThisViewNeedsToBeDisplayed" object:nil];

ビューコントローラーを配置する場合、ビューが表示されていないときにオブザーバーから self を削除することを忘れないでください:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"NotificationThatThisViewNeedsToBeDisplayed"];

このようにして、モデルはプレゼンテーションから分離されます。

于 2012-09-11T20:33:38.567 に答える
1

次を使用して、現在のviewController(任意のviewControllerサブクラス)に新しいビューを表示させます。

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

編集: 最上位のビュー コントローラーを見つけるには、UITabBarController に selectedViewController (tabBarController を使用する場合) を要求して「シード」を取得するか、window.rootViewController から開始します。

tabBarControllers を通過したら、UIViewController サブクラスと UINavigationControllers のみを持つ必要があります。次のようなループを使用できます。

- (UIViewController *)frontmostController:(UIViewController *)seed
{
    UIViewController *ret;
    if([seed isKindOfClass:[UINavigationController class]]) {
        ret = [(UINavigationController *)seed topViewController];
    } else
    if([seed isKindOfClass:[UIViewController class]]) {
        ret = seed.presentedViewController;
    }
    return ret ? [self frontmostController:ret] : seed;
}
于 2012-09-11T20:26:14.047 に答える