我有一个UINavigationBar类的子类。在viewDidLoad中我有:
- (void)viewDidLoad
{
[super viewDidLoad];
UINavigationBar *bar = [[UINavigationBar alloc] init];
NSString* path = [[NSBundle mainBundle] pathForResource:@"topbanner" ofType:@"png" inDirectory:@"assets"];
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; //crash here!
[self.view addSubview:bar];
}
我从tableView中调用它。当我在模拟器上运行时,一切都很好,当我尝试在设备应用程序崩溃时运行。我有一个错误:
+[UINavigationBar appearance]: unrecognized selector sent to class 0x3e3fe490
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UINavigationBar appearance]: unrecognized selector sent to class 0x3e3fe490'
为什么?
编辑: 我的topbanner文件我在Xcode中的 blue 目录文件夹中。在模拟器中,一切看起来都很好。
EDIT2: 当然,当我在我的设备中删除这行代码时,我的应用程序看起来不错,但导航栏上没有图像(oc)。
答案 0 :(得分:3)
appearance
方法是iOS 5.0的新方法。您可能正在使用iOS 5.0的模拟器,但您的设备可能使用较低的iOS版本。
最好在调用它之前检查一下respondsToSelector以使用此方法修改外观。
来自UINavigationBar文档:
在iOS v5.0之前,与导航一起使用时 控制器,你可以只有少数直接自定义 进入导航栏。具体来说,可以修改 barStyle,tintColor和半透明属性,但绝对不能 直接更改UIView级属性,如框架,边界, alpha或隐藏的属性直接。另外,你应该让 导航控制器管理导航项目的堆栈而不是 尝试自己修改这些项目。
答案 1 :(得分:1)
你试过了吗?
[self.navigationController.navigationBar setBackgroundImage:YOURIMAGE forBarMetrics:UIBarMetricsDefault];