1

iPhone アプリでは、UINavigationController クラスの外観をカスタマイズする必要があります。たとえば、バーとフォント サイズを大きくします。私のクライアントは本当にそれを必要としており、さらに大きなボタンも必要としています。

そこで、クラスをゼロから作成する代わりに、UINavigationController をサブクラス化することにしました。私の質問は、メソッドまたは属性のデフォルト値をカスタマイズできますか? クラスをサブクラス化する際に制限はありますか?

4

2 に答える 2

2

いいえ、お気軽に発狂してください。多くの Cocoa クラスは、他のクラスほどサブクラス化に適しておらず (特に、デリゲート コントロールに依存することを意図したもの)、必要な機能を公開しない可能性がありますが、プライベートではないメソッド (_ で始まる) を自由にサブクラス化できます。プレフィックス)。本当にしたい場合は、それらをサブクラス化することもできますが、iPhone では、Apple がアプリを拒否する可能性があります。

于 2009-06-10T22:03:01.773 に答える
2

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

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

この場合、クラスをゼロから作成しないのはまったく正しいことです — それは悪い考えです。属性 (フィールド?) のデフォルト値を変更したい場合は、親の初期化子を呼び出した後、初期化子で目的の値を設定できます。ただし、これを行う場合は、親クラスで何かをホストしていないことを確認し、常に徹底的にテストしてください。

Apple は "_" で始まるメソッドを独自に使用するために予約しています。もちろん、他のすべては当然のことです。:-)

于 2009-06-11T16:48:58.943 に答える