0

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'

なんで?

編集:Xcodeの青いディレクトリフォルダにあるトップバナーファイル。エミュレーターでは、すべてが正常に見えます。

EDIT2:もちろん、デバイスでこのコード行を削除すると、アプリは見栄えがしますが、ナビゲーションバー(oc)に画像が表示されません。

4

2 に答える 2

3

appearanceメソッドは iOS 5.0 で新しく追加されました。iOS 5.0 でシミュレーターを使用している可能性がありますが、お使いのデバイスではそれより古いバージョンの iOS を使用している可能性があります。

このメソッドを使用して外観を変更するために呼び出す前に、respondsToSelector で確認することをお勧めします。

UINavigationBar のドキュメントから:

iOS v5.0 より前のバージョンでは、ナビゲーション コントローラーと組み合わせて使用​​する場合、ナビゲーション バーを直接カスタマイズできるものはごくわずかです。具体的には、barStyle、tintColor、および半透明のプロパティを変更することは問題ありませんが、フレーム、境界、アルファ、または隠しプロパティなどの UIView レベルのプロパティを直接変更してはなりません。さらに、ナビゲーション コントローラーにナビゲーション アイテムのスタックを管理させ、これらのアイテムを自分で変更しようとしないようにする必要があります。

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

于 2012-05-14T16:18:38.353 に答える
1

やってみました:

[self.navigationController.navigationBar setBackgroundImage:YOURIMAGE forBarMetrics:UIBarMetricsDefault];
于 2012-05-14T16:21:44.847 に答える