繁体   English   中英

如何使用Interface Builder创建带有UINavigationController的UIViewController?

[英]How to create an UIViewController with UINavigationController with Interface Builder?

在我的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模态视图控制器。

[/编辑]


[EDIT2]
谢谢你的帮助! 是的,navigationController是nil ...我想我以错误的方式添加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,但没有成功。 这是一个非常讨厌的bug!

我的第二次尝试是创建一个类别并覆盖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”是一个只读属性!AAAAHHHHHHHHHH!

我有最后一次机会:在Interface Builder中,可以为UINavigationController提供一个自己的UINavigationBar! 是! 我知道了!! :-)

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

PS:也许,有人可以将此线程发送给Apple,这一切都非常烦人的情况和错误:-(

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

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

更新

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

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

我在索引1使用了对象,因为在你的截图中有一个tableview,我认为它将是索引0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM