仅限设备上的UINavigationBar外观错误

时间:2012-05-14 16:14:05

标签: objective-c ios uinavigationbar

我有一个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)。

2 个答案:

答案 0 :(得分:3)

appearance方法是iOS 5.0的新方法。您可能正在使用iOS 5.0的模拟器,但您的设备可能使用较低的iOS版本。

最好在调用它之前检查一下respondsToSelector以使用此方法修改外观。

来自UINavigationBar文档:

  

在iOS v5.0之前,与导航一起使用时   控制器,你可以只有少数直接自定义   进入导航栏。具体来说,可以修改   barStyle,tintColor和半透明属性,但绝对不能   直接更改UIView级属性,如框架,边界,   alpha或隐藏的属性直接。另外,你应该让   导航控制器管理导航项目的堆栈而不是   尝试自己修改这些项目。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationBar_Class/Reference/UINavigationBar.html

答案 1 :(得分:1)

你试过了吗?

[self.navigationController.navigationBar setBackgroundImage:YOURIMAGE forBarMetrics:UIBarMetricsDefault];