[英]Changing the Title View of a UINavigationController UIViewController in Interface Builder
[英]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]
我需要在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.