【问题标题】:Warning: Attempt to present <CustomViewController> on <UINavigationontroller> whose view is not in the window hierarchy警告:尝试在视图不在窗口层次结构中的 <UINavigationontroller> 上显示 <CustomViewController>
【发布时间】:2013-10-21 22:31:10
【问题描述】:

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

我有一个自定义视图控制器,我试图在用户点击按钮时显示视图控制器(所以这里没有“臭名昭著的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 &lt;ICLoginViewController: 0xa08a810&gt; on &lt;UINavigationController: 0xa45de70&gt; whose view is not in the window hierarchy! 错误。屏幕上什么也没有发生。如果我多次点击我会得到同样的错误,但仍然没有任何反应。我设置了一个断点并验证了navigationControllernavigationController.topViewController 不是nil。我使用情节提要(如果有帮助),但不适用于我要显示的自定义视图控制器。 (从长远来看,我想让它成为一个独立于应用程序的库,所以我没有在其中引用任何特定于应用程序的模块)为什么会出现这个错误?

【问题讨论】:

  • 不使用self.navigationController有什么具体原因吗?
  • 是的,我愿意。我将这段代码放在一个独立于应用程序的单独文件中,在这种情况下,self 只是一个NSOBject 派生的自定义类,而不是视图控制器。

标签: iphone ios objective-c uiviewcontroller ios7


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果它在 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 的导航堆栈找到你的方式。

    【讨论】:

    • 我不想处理从应用程序呈现视图控制器的问题。它只会调用登录方法,如果合适,我的库将显示登录视图控制器(阅读:用户未登录或访问令牌无效)。我已经将自定义视图控制器封装在我的框架中(至少实际上是这样),我不希望用户直接访问视图控制器。
    • 您仍然需要从屏幕上的另一个视图控制器呈现视图控制器。从查看您的错误来看,您正在呈现的控制器当时实际上并不在屏幕上。使用上面的方法并将其放入您创建的 NSObject 中,您应该能够阻止他们尝试使用登录控制器访问的视图控制器。
    • 是的,我刚刚发现我的模态视图控制器(我从中调用此方法)不等于顶部视图控制器。如果我将其更改为推动 segue,那么一切都解决了,我的顶视图控制器是当前的。我不知道为什么会这样..
    • 也许试试 navController.visibleViewController 而不是 Top。由于我不知道您的应用程序的结构,因此很难衡量导航步进的要求。
    • 是的,我刚刚把它改成了那样。我的视图控制器显示正确,然后应用程序崩溃 EXC_BAD_ACCESS...我现在尝试启用僵尸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多