【问题标题】:How to create an UIViewController with UINavigationController with Interface Builder?如何使用 UINavigationController 和 Interface Builder 创建 UIViewController?
【发布时间】:2011-06-04 00:41:48
【问题描述】:

在我的 iOS 应用程序中,我想提供一个设置视图。 “presentModalViewController”效果很好:

ViewSettings *controller = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentModalViewController:navController animated:YES];      
[controller release];
[navController release];

不幸的是,我必须更改正在运行的代码并创建 ViewSettings,包括 Interface Builder 中的 UINavigationController。为什么?长话短说,我会在这个帖子的最后解释一下......

我尝试在我的 ViewSettings 中拖放一个 UINavigationController 并创建一个 IBOutlet 以在我的班级中访问它。我将此控制器提供给“presentModalViewController”,但应用程序崩溃了......

我做错了什么?


[编辑]

错误消息:GDB:程序收到信号:“SIGABRT”。
错误发生在这段代码的最后一行:

ViewSettings *viewSettings = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = viewSettings.navigationController;
UINavigationBar *navBar = navController.navigationBar;
OwnNavigationBar *ownNavBar = (OwnNavigationBar *)navBar;
[ownNavBar drawHeaderImage:YES];
[self.navigationController presentModalViewController:navController animated:YES];

详细错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现 nil 模态视图控制器。”

[/EDIT]


[EDIT2]
谢谢你的帮助! 是的,navigationController 是零…… 我想我以错误的方式添加 UINavigationController ......我把它放在这个窗口中,因为它不可能直接放在我的视图中:
如何正确添加 UINavigationController?
[/EDIT2]


PS:为什么一定要使用IB? (你可以跳过这个...)

我的 UINavigationBar 中需要一个背景图片。我的第一次尝试是:

UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];

但在某些问题中,UIBarButton 的标题或不可见!我尝试了很多,例如在每个视图中设置视图的“标签”和sendSubviewToBack,但没有成功。这是一个非常烦人的错误!

我的第二次尝试是创建一个类别并覆盖 drawRect 方法:

@implementation UINavigationBar(MyNavigationBar)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"header.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

但是现在,我所有的 UINavigationBars 都有一个背景图像,我无法停用它。问题是,“ViewSettings”需要背景图片,但下面推送的视图不需要。

很遗憾,无法在类别中设置属性或调用 [super drawRect:rect] 来避免绘制图像。

我最后一次尝试是写一个自己的 UINavigationBar

@interface OwnNavigationBar : UINavigationBar {
    BOOL _drawHeaderImage;
}

现在我可以控制 drawRect 方法了!!太棒了!!

- (void)drawRect:(CGRect)rect {
    if (_drawHeaderImage) {
        UIImage *image = [UIImage imageNamed: @"header.png"];
        [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
    else {
        [super drawRect: rect];
    }
}

但我庆祝得早... :-( 无法在 UINavigationController 中设置自己的 UINavigationBar !!! UINavigationController 中的“navigationBar”是只读属性! 啊啊啊啊啊啊!

我还有最后一次机会:在 Interface Builder 中,可以给 UINavigationController 一个自己的 UINavigationBar! 是的!我得到了它!! :-)

我在我的 MainWindow_iPhone.xib 中配置了它,效果很好! 现在,我必须为我的 ViewSettings 实现它,因为这个(模态)视图需要一个新的 UINavigationController。

PS:也许,有人可以把这个帖子发给苹果,这都是非常烦人的情况和错误:-(

【问题讨论】:

  • 崩溃时是否有任何错误信息?
  • 什么是崩溃错误和堆栈跟踪?
  • GDB:程序接收到的信号:“SIGABRT”。我将在上面编辑我的问题,请稍等...
  • 这是一个非常普遍的错误,您可以通过查看调试日志了解更多信息。确保您在调试模式下运行,并在崩溃后单击“显示控制台”小按钮。然后发布实际的崩溃错误和堆栈跟踪 - 应该会有所帮助;)
  • *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标 上呈现 nil 模式视图控制器。”

标签: iphone objective-c ios interface-builder uinavigationcontroller


【解决方案1】:

当您从 nib 初始化视图控制器时,它实际上并没有立即加载 nib,因此 viewSettings.navigationController 仍然为零。第一次引用 view 属性时,将加载 nib。

更新

您可以自己加载 nib 并抓取导航控制器,如下所示:

UINavigationController *navController = [[[NSBundle mainBundle] loadNibNamed:@"ViewSettings" owner:self options:nil] objectAtIndex:1];

我在索引 1 处使用了对象,因为在您的屏幕截图中有一个我认为索引为 0 的 tableview。

【讨论】:

  • 非常感谢!是的,你是对的,navigationController 是 nil。我在我的问题中添加 [EDIT2] ...
  • 我尝试“NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"ViewSettings" owner:self options:nil];"但收到此错误消息:“此类不符合键导航控制器的键值编码”此错误消息有很多线程,但我不知道我的错误在哪里:-(我想,我连接UINavigationController 在 Interface Builder 中以错误的方式。但是你如何正确地做到这一点?我只是在 ViewSettings.xib 中绘制和放置 UINavigationController(见截图)并将“引用插座”设置为“navigationController”。请帮助.. .
  • nib 中的文件所有者是什么类型的对象?
  • "ViewSettings" 是一个 UITableViewController。我在 Xcode 中创建它:“New File... -> UIViewController subclass”并激活复选框“UITableViewController subclass”和“With XIB for user interface”。所以我有 3 个生成的文件:ViewSettings.h、ViewSettings.m 和 ViewSettings.xib
  • 你有连接到文件所有者 navigationController 属性的 nib 中的导航控制器吗?如果是这样,请尝试断开该连接。
【解决方案2】:

如果您要显示 nib 文件的内容会很有帮助,因为我怀疑 viewSettings.navigationController 是 nil。 navigationController 是所有 UIViewControllers 的一个属性,它为您提供它们的父导航视图控制器(如果存在)。听起来您从未将 viewSettings 视图控制器添加到导航控制器的视图控制器堆栈中。

【讨论】:

  • 非常感谢!是的,你是对的,navigationController 是 nil。我在我的问题中添加 [EDIT2] ...
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多