如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

Posted

技术标签:

【中文标题】如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?【英文标题】:How to dismiss a modal view controller, then immediately have the presenting view controller present a different modal view controller? 【发布时间】:2014-01-12 22:56:05 【问题描述】:

我使用IIViewDeckController 作为我的根视图控制器。这是一个库,它允许我拥有一个类似于 facebook 应用程序中的滑动菜单的滑动菜单视图控制器。它通过使用中心和左视图控制器启动它,然后将整个事物设置为根视图控制器来工作。这是AppDelegate.m 中的样子:

FeedViewController* mainFeed = [[FeedViewController alloc] init];
UINavigationController* mainStack = [[UINavigationController alloc] initWithRootViewController:mainFeed];

MenuViewController* sideMenu = [[MenuViewController alloc] init];

IIViewDeckController* viewDeck = [[IIViewDeckController alloc] initWithCenterViewController:mainStack leftViewController:sideMenu];

self.window.rootViewController = viewDeck;

当在中心视图控制器 (navStack) 中时,我有一个按钮,按下时会显示一个模态视图控制器 login

- (void)openLogin
    LoginViewController* login = [[LoginViewController alloc] init];
    [self presentViewController:login animated:YES completion:nil]; 

login,用户输入凭据并登录后,我尝试让navStack 关闭login,然后立即推入另一个控制器creator

- (void)dismissLoginController
    //get a reference to the mainFeed
    IIViewDeckController* viewDeck = (IIViewDeckController*)self.presentingViewController;
    UINavigationController* navStack = (UINavigationController*)viewDeck.centerController;
    FeedViewController* mainFeed = (FeedViewController*)navStack.topViewController;

    //have it dismiss login, then push creator
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    [mainFeed openListingCreator];

openListingCreatormainFeed:

- (void)openListingCreator
    ListingCreatorViewController* creator = [[ListingCreatorViewController alloc] init];
    UINavigationController* creationStack = [[UINavigationController alloc] initWithRootViewController:creator];
    [self presentViewController:creationStack animated:YES completion:nil];

我得到的错误是:Warning: Attempt to present <UINavigationController: 0xa40c790> on <IIViewDeckController: 0xa843000> whose view is not in the window hierarchy!

我假设这是因为当我要求 IIViewDeckController 呈现视图控制器时,它不在屏幕上。但是openListingCreator 在我关闭login 视图控制器之后被调用,所以我不确定它为什么这样做。我相信它与 IIViewDeckController 有关,因为我之前在其他没有它的项目中也做过同样的完全相同的过程并且没有任何问题。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您收到此错误是因为在 LoginViewController 的过渡效果仍处于活动状态时正在调用 openListingCreator。您可以将[mainFeed openListingCreator]; 放在[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 的完成块中,或者直接从LoginViewController 中呈现creationStack

[self.presentingViewController dismissViewControllerAnimated:YES completion:^
    [mainFeed openListingCreator];
];

【讨论】:

以上是关于如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

关闭模态,然后立即推视图控制器

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

如何从 appdelegate 呈现和关闭模态视图?

将模态呈现的视图控制器关闭到不同的底层视图控制器

ios:如何关闭模态视图控制器,然后弹出推送的视图控制器

呈现模态视图控制器,使其tableview一点一点下移