2009-06-10 10 views
1

iPhoneアプリでは、UINavigationControllerクラスの外観をカスタマイズする必要があります。たとえば、バーとフォントサイズを大きくします。私のクライアントには本当にそれが必要で、大きなボタンも必要です。あなたはobjective-cでサブクラス化をどこまで使うことができますか?

したがって、最初からクラスを書く代わりに、私はUINavigationControllerをサブクラス化することにしました。私の質問は、任意のメソッドや属性のデフォルト値をカスタマイズできますか?クラスをサブクラス化する際に制限はありますか?

答えて

2

「制限」の意味によって異なります。ランタイムはあなたが好きなものをサブクラス化するのを妨げませんが、いくつかの問題があります。 (あなたの答えはUINavigationControllerについて、具体的ではあるが、タイトルとコンセプトが大きくされているので、私は大きな問題に対処します。)

  1. @privateと子のクラスをマークされている親クラスの変数にアクセスすることはできませんがあるかもしれません、アクセス可能な既定値の@protectedを指定します。
  2. 一部のクラスはサブクラス化のために設計されていますが(ほとんどのAppKitクラスとUIKitクラスがあります)、他のクラスは非常に賢明ではありません。たとえば、NSString、NSMutableArrayなどの基本的な基底クラスは実際にはクラスクラスタです。つまり、クラスのインスタンスは実際にはいくつかのプライベートクラスの1つになる場合があります。
  3. がサブクラス化のために設計されたであるクラスは、通常、オーバーライドする必要のあるキーメソッドを文書化します。例えば、NSDictionaryとNSMutableDictionaryは、他のすべてのメソッドが呼び出すいくつかの「プリミティブ」メソッドを記述しています。したがって、2または3をそれぞれオーバーライドすれば、他のすべてのメソッドを再実装せずに動作を変更できます。
  4. 親クラスのオーバーライドされたメソッドの実装を、必要に応じて、非常に注意してください。これは、UIクラスでは特に重要です。単純なget/setデータクラスよりも複雑な動作をすることがよくあります。

この場合、クラスを最初から作成しないでください。これはBad Idea™になります。属性のデフォルト値(フィールド?)を変更する場合は、の後に、イニシャライザに希望の値を設定して、親の初期化子を呼び出すことができます。しかし、これを行う場合は、親クラスで何かをしゃべらないようにして、常に徹底的にテストしてください。

アップルでは独自の方法で「_」で始まるメソッドを予約しています。そのため、マークには触れないように注意してください。他のすべては、当然ながら、公正なゲームです。 :-)

2

いいえ、気をつけてください。多くのCocoaクラスは、他のもの(特に代理コントロールに依存することになっているもの)よりもサブクラスに優しいクラスではなく、必要な機能を公開することはできませんが、プライベートではないメソッド接頭辞)。あなたが本当にしたい場合は、それらをサブクラス化することもできますが、iPhoneのチャンスではAppleがあなたのアプリを拒否することになります。