2011-08-03 11 views
2

私がしたいのは、画像があるナビゲーションバーです。メインビューにタブコントローラーがあり、各タブの中にUINavigationControllerがあります。私のタブが/ navigationController呼び出しのUIViewControllerの内側から、私はviewDidLoadメソッド内でこれをやって、多くの問題もなくtitleViewを設定できますUINavigationBarを上書きしてデフォルトのタイトルビューを設定します。

self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease]; 

しかし、私はこのビューのための私のnavigationBarですべてのタイトルを置き換えたい、とどこでもこれを繰り返すのは醜いようです。だから私はデリゲートでこれを行いました(すべてのアウトレットのものをリンクした後)

self.tabOneNavController.navigationBar.topItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease]; 

もう一度やりました!オク、私はほとんどそこに着いています。 しかし、ポイントは、私は5つのタブがあり、それらのすべてにnavigationControllerがあります。コードの繰り返しはすべての内部ビューからわずか5回に減らしましたが、まだそれは残っています。それは私が各タブのNavControllerのためにそれを行う必要があります。

次にUINavigationBarを拡張して自分自身を作成し​​ようとしましたが、ここで初期化子でこれを設定し、インターフェイスビルダーでオブジェクトクラスとして使用できます。しかし、それは動作していないようです。ここに私がやったことです:UINavigationBarから継承MyNavigationBarインタフェースファイル内

@implementation MyNavigationBar 

- (id)init { 
    self = [super self]; 

    self.tintColor = [UIColor greenColor]; 
    self.topItem.title = @"testing please work"; 

    return self; 
} 

@end 

。しかし、これはうまくいかなかった。私は他の方法を上書きすべきですか?どれ?これは良い習慣ですか? 私は、各タブにナビゲーションバーを1つ追加する必要があるかどうかはわかりません。言われたように、タブがあり、ナビゲーションバーを持っていたいと思っています。今では、インタフェースビルダー/アウトレットとクラスがどのように機能するかを把握しようとしています。コードは機能していますが、私はそれを解凍したいだけです。

ありがとうございました!

答えて

3

あなたが記述する繰り返しコードの問題は、洗練された解決策です。 Objective-Cは "カテゴリ"と呼ばれるものをサポートしています。これにより、クラスにメソッドを追加できます。これの一般的な用途は、ナビゲーションとタブバーをカスタマイズすることです。 Xcode 4では、UINavigationBarでカテゴリを追加するために、次のような操作を行います。

「Command New File」ダイアログを開きます。次に、ココアタッチメニューから「Objective-Cのカテゴリ」を選択します。

Creating a category

次へ]をクリックして、あなたがカテゴリとしてメソッドを追加したいクラスの名前を入力するように求められます。それは次のようになります。

Making a Category on the NavBar

その後、あなたは、ファイルを保存ダイアログで終わる必要があります。ここでの大会についての簡単なメモ。コンベンションでは、元のクラスの後のカテゴリ、プラス記号、追加する内容の名前を付けます。その美しさで

Empty Category

、ルック:あなたは、ファイルを保存すると、あなたはこのような何かを得る必要があります。

Category Naming Convention

:ここではあなたがどのようなものであるかです。これで、デフォルトのdrawing/initメソッドをオーバーライドするだけでなく、navbarの機能を拡張することができます。

私はinitdrawRectの方法を調べることをお勧めしますが、どの人が使用するのか覚えていません。また、NDAの下では、iOS 5ではこれが変わる可能性があるので、その可能性については準備をしてください。

+0

これは魅力的なように機能しました。ありがとうございます!ちょうど質問、私は私のカテゴリのインターフェイス '@プロパティ(非原子的な、保持)IBOutlet UIImageView * barTitle;'のプロパティを宣言し、インターフェイスビルダーで、私はそこにある画像ビューにリンクしました。それから、drawRecの実装の中からtitleViewを設定しようとしました。しかし、アウトレットがリンクしているため、アプリが起動するとすぐにエラーが発生します。これを行うためにとにかくありますか?私はちょうど興味がある。 @synthesizeを追加しようとしましたが、カテゴリ内では不可能と言われています。 – Tiago

+0

右のカテゴリはサブクラスではありません。メソッドは追加できます。プロパティを追加することはできません。 – Moshe

+0

私はこれを行う方法が不思議でした。甘い – vinylDeveloper

3

self.navigationItem.titleViewを介してタイトルビューを設定するUIViewControllerサブクラスを定義し、他のビューコントローラをそのクラスから拡張するのはなぜですか?次に、実装を繰り返すことなくすべてのコントローラでその動作を共有します。

関連する問題