显示隐藏在导航控制器下的视图控制器

Posted

技术标签:

【中文标题】显示隐藏在导航控制器下的视图控制器【英文标题】:Presented view controller hidden under navigation controller 【发布时间】:2014-06-11 15:36:50 【问题描述】:

我对 ios 开发真的很陌生,现在正在学习一些课程以进入它。目标是修复一个由前同事在 2011 年初创建的非常旧的应用程序。我遇到了无法修复的问题。

我想展示一个显示登录屏幕的 ViewController。但是当 ViewController 出现时,它会隐藏在 navigationController 和状态栏下。我也收到此错误:

不鼓励在分离的视图控制器上显示视图控制器

代码如下:

    Login *fvController = [[Login alloc] initWithNibName:@"Login" bundle:[NSBundle mainBundle]];
    [fvController setTitle:@"Login"];
    UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:fvController];
    [fvController setKc:self];
    [self presentViewController:navCon animated:YES completion:nil];
    [fvController release];
    [navCon release];
    navCon = nil;
    fvController = nil;

谁能帮帮我?

提前致谢!

【问题讨论】:

【参考方案1】:

UIWindows 有一个 rootViewController 字段指向层次结构中的第一个视图控制器。如果你从这个层次结构之外的控制器展示一个视图控制器,就会发生奇怪的事情。

检查您的密钥窗口 ([yourUIApplication keyWindow]) 是否设置了此字段。如果它是 nil 你的整个层次结构是分离的,它需要重新调整。如果窗口有一个根视图控制器,您可以在重构层次结构时从这里展示您的视图,以便所有视图最终都连接到根。

【讨论】:

您好,感谢您的评论!我不知道在哪里做这个。我在我的 AppDelegate 中设置了 rootViewController,如下所示:window.rootViewController = tabBarController; [window makeKeyAndVisible]; 你说得对,层次结构一定有问题。此应用使用 Xib 的 btw。【参考方案2】:

这是因为您正在释放您创建的 ViewController 实例,请尝试更改如下代码:

在 viewController 顶部的 @implementation 下声明你的 viewControllers

@implementation yourViewController

   Login *fvController;
   UINavigationController *navCon;

现在像这样更改您的代码

fvController = [[Login alloc] initWithNibName:@"Login" bundle:[NSBundle mainBundle]];
[fvController setTitle:@"Login"];
navCon = [[UINavigationController alloc] initWithRootViewController:fvController];
[fvController setKc:self];
[self presentViewController:navCon animated:YES completion:nil];

并将您的释放对象添加到 dealloc 方法

- (void)dealloc 

    [fvController release];
    [navCon release];
    navCon = nil;
    fvController = nil;

【讨论】:

感谢您的评论。这实际上是行不通的。我在 dealloc 方法中收到 Use of undeclared identifier 错误。 您收到这些错误是因为您的视图控制器未声明为全局。我将编辑我的答案。 再次感谢您的评论。这些错误现在确实消失了。但是我现在收到 Local declaration of '' hides instance variable 警告。顺便说一句,我在整个项目中收到了很多这样的警告。 您收到这些错误是因为您再次声明了您在实现中声明的变量或综合属性。因此,在实现下,您声明了 Login *fvController。但在另一种方法中,您再次声明 Login *fvController;而您只需键入 fvController。 有道理,谢谢!但这并没有解决问题。呈现的 viewController 仍然隐藏在 navigationController 之下。我还收到了这个不鼓励在分离的视图控制器上显示视图控制器警告。认为它更多地与设置根控制器有关,从那里呈现这个新的 viewController,就像@JavierC 状态一样。但我无法弄清楚这到底意味着什么......

以上是关于显示隐藏在导航控制器下的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在一个视图控制器上隐藏导航栏,在推送的控制器上显示它

导航栏在第二次和后续出现时隐藏在视图控制器上

搜索显示控制器如何隐藏导航栏?

导航栏隐藏在 iPhone sdk 的弹出视图控制器上

SWRevealViewController 隐藏我的前视图控制器的导航栏

弹出视图控制器离开堆栈而没有显示导航栏? [关闭]