如何用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
视图控制器添加到导航控制器的视图控制器堆栈。