如何用UINavigationController和Interface Builder创build一个UIViewController?

在我的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]; 

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

我尝试在ViewSettings中拖放一个UINavigationController,并创build一个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]; 

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

[/编辑]


[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的标题是不可见的! 我尝试了很多,例如在每个视图中设置视图的“tag”和sendSubviewToBack,但是没有成功。 这是一个非常烦人的错误!

我的第二个尝试是创build一个类别并覆盖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都有一个背景图片,我无法closures它。 问题是,“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中configuration它,它工作的很好! 现在,我必须为我的ViewSettings实现这个,因为这个(模态)视图需要一个新的UINavigationController。

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

当你从一个笔尖初始化一个视图控制器的时候,它实际上并没有真正加载笔尖,所以viewSettings.navigationController仍然是零。 第一次引用view属性时,将会加载该笔尖。

更新

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

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

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

如果你显示你的nib文件的内容会是有帮助的,因为我怀疑viewSettings.navigationController是零。 navigationController是所有UIViewControllers一个属性,它给你他们的父导航视图控制器,如果存在的话。 这听起来像你从未将viewSettings视图控制器添加到导航控制器的视图控制器堆栈。