我使用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];
}
openListingCreator
中的 mainFeed
:
- (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有关,因为我之前在没有它的其他项目中完成了同样的精确过程并且没有任何问题。
有什么想法吗?
答案 0 :(得分:2)
您收到此错误是因为openListingCreator
的转换效果仍处于活动状态时正在调用LoginViewController
。您可以将[mainFeed openListingCreator];
直接放在[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
的完成块中,也可以直接从creationStack
放置LoginViewController
。
[self.presentingViewController dismissViewControllerAnimated:YES completion:^{
[mainFeed openListingCreator];
}];