0

我知道这个问题已经被问了一百万次了,但是在我检查过的许多问题中我找不到合适的答案。

我有一个自定义视图控制器,我试图在用户点击按钮时显示视图控制器(所以viewDidLoad这里没有“臭名昭著的问题”)。

这是我在用户点击按钮时运行的代码:(我有视图控制器的 NIB,我有一个导航控制器)

ICLoginViewController *loginViewController = [[ICLoginViewController alloc] initWithNibName:@"ICLoginViewController" bundle:[NSBundle mainBundle]];
//assuming we have a navigation controller.

UINavigationController *navigationController= (UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController;
[navigationController.topViewController presentViewController:loginViewController animated:YES completion:nil];

当我Warning: Attempt to present <ICLoginViewController: 0xa08a810> on <UINavigationController: 0xa45de70> whose view is not in the window hierarchy!尝试呈现视图控制器时出现错误。屏幕上什么也没有发生。如果我多次点击我会得到同样的错误,但仍然没有任何反应。navigationController我已经设置了一个断点并验证了它navigationController.topViewController不是nil。我使用情节提要(如果有帮助),但不适用于我要显示的自定义视图控制器。(从长远来看,我想让它成为一个独立于应用程序的库,所以我没有在其中引用任何特定于应用程序的模块)为什么会出现此错误?

4

2 回答 2

1

我找到了解决方案。问题是,我的模态显示视图控制器不是导航控制器中的“顶部”视图控制器。如果我将调用视图控制器更改为推送而不是模态,那么它将成为顶视图控制器,我的应用程序运行良好。显然,这与我的自定义视图控制器无关,而是我的导航堆栈。

于 2013-10-21T22:59:07.113 回答
0

如果它在 NSObject 中,则在 NSObject 中创建一个方法,该方法将您当前的 viewController 作为参数并将其显示在那里。例如:

-(void)presentInViewController:(UIViewController *)controller{
    ICLoginViewController *loginViewController = [[ICLoginViewController alloc] initWithNibName:@"ICLoginViewController" bundle:[NSBundle mainBundle]];
    [controller presentViewController:loginViewController animated:YES completion:^(BOOL comp){}];
}

这样你就可以在任何你想要的地方调用视图控制器,而不是试图从 UIApplication 的导航堆栈中找到你的方式。

于 2013-10-21T22:48:39.650 回答