6

アプリが「application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo」で受信するすべてのプッシュメッセージの後に modalviewcontroller を提示したい

ビューコントローラーを次のように提示します。

ReleaseViewController *viewController = [[ReleaseViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.window.rootViewController presentModalViewController:navController animated:YES];

したがって、別のプッシュ メッセージが到着し、古い ModalViewController がまだ表示されている場合は、古い ModalViewController の上に新しい modalviewcontroller を提示したいと考えています。しかし、うまくいきません。何も起こらず、コンソールには次のように表示されます (iOS 6 Beta のデバッグ メッセージだと思います)。

Warning: Attempt to present <UINavigationController: 0x1dde6c30> on <UINavigationController: 0x1dd73c00> whose view is not in the window hierarchy!

私は何を間違っていますか?

PS: 古い ViewController を却下したくありません。スタックさせたいのです。

ありがとう!

4

3 に答える 3

11

View Controller のトップを取得し、その Top View Controller から新しいモーダルを提示できます

- (UIViewController *)topViewController:(UIViewController *)rootViewController
{
    if (rootViewController.presentedViewController == nil) {
        return rootViewController;
    }

    if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]]) {
        UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;
        UIViewController *lastViewController = [[navigationController viewControllers] lastObject];
        return [self topViewController:lastViewController];
    }

    UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;
    return [self topViewController:presentedViewController];
}

このメソッドは rootViewController で呼び出すことができます ウィンドウの rootViewController です

于 2012-07-31T21:04:32.913 に答える
0

これは上記と同じですが、Swiftで書かれています

private func topViewController() -> UIViewController {
    var rootViewController = UIApplication.sharedApplication().keyWindow!.rootViewController!
    repeat {
        if rootViewController.presentingViewController == nil {
            return rootViewController
        }
        if let navigationController = rootViewController.presentedViewController as? UINavigationController {
            rootViewController = navigationController.viewControllers.last!
        }
        rootViewController = rootViewController.presentedViewController!
    } while true
}
于 2015-12-21T09:24:58.710 に答える