3

コンポーネント (UIButton など) をサブクラス化すべきではないことを何度も読みました。

問題は、Interface Builder を使用する場合です。たとえば、多くのビューに正確な外観のボタンがあります。IB を使用して毎回設定することも (面倒です)、カスタム クラスを使用してカスタムの動作と外観を因数分解することもできます。

IB でプロセスを単純化する唯一の方法は、誰もが反対する方法で行うことであるというのは、私には少し矛盾しているように思えます。

より良い解決策はありますか?IB でカテゴリを使用できますか?

ありがとう。

4

3 に答える 3

3

UIView 外観プロキシを使用できる場合があります。ボタンに対して何をしているのかわかりませんが、これが役立つかもしれません:

これをAppDelegateファイルに入れ、application:didFinishLaunchingWithOptions:メソッドに入れます

if([UIButton conformsToProtocol:@protocol(UIAppearanceContainer)]){
    [[UIButton appearance] setBackgroundImage:[UIImage imageNamed:@"YourImage"] forState:UIControlStateNormal];
    //modify any other UIButton properties you want to set globally
}
于 2013-08-01T15:47:01.747 に答える
2

特に IB での構成を簡単にする目的で、UIButton をサブクラス化してはならない理由はわかりません。あなたが提供したリンクのどちらも、サブクラス化すべきではない理由を説明していないため、その主張は信頼できないようです。一方、UIButton.h に が存在するUIButtonTypeCustomことは、フレームワークの作成者が UIButton サブクラスを計画していたという印象を与えます。

于 2013-08-01T20:58:37.670 に答える
2

あなたが提供した2番目のリンクは非常に明確でした.

最良の例は iOS 7 です。今では状況はまったく異なります。たとえば、私が維持しているアプリケーションにはサブクラス化UIControlされた .動作します(内部を繰り返してsubviewsいくつかのものを置き換えます)。アプリが拒否されることはないかもしれませんが、維持するのは面倒です。

経験則として、UIButton に対して外部からできることはすべて、次のようになります。

[myButton setBackgroundImage:... forState:...];
[myButton setTextColor:... forState:...];
myButton.titleLabel.font = ...

カスタム サブクラス メソッドの内部に移動できます。

+ (UIButton*)fancyPantsButton
{
    UIButton *button = [UIButton butonWithType:UIButtonTypeCustom];

    [myButton setBackgroundImage:... forState:...];
    [myButton setTextColor:... forState:...];
    myButton.titleLabel.font = ...

    return button;
}

initこれは、問題がある場合でも問題なく実行することもできawakeFromNibます (私は通常、後者を好みます)。

UIAppearenceユーザーhw731によって提案されたように、オプションもあります。本当にあなたのボートを浮かせるものは何でも。

2番目の質問については、nibファイルはクラスのインスタンスを作成しsetValue:forKey:、ロード時に使用して保存するものを埋めます(そのため、「クラスは何かのキー値に準拠していません」などのエラーが発生します) nib)、したがって、nib がロードされているときに何かが分類されている場合、はい、nib は単にinitWithCoder.. を使用してギャップを埋めるため、カテゴリを尊重します。

また、同じように、IB の「ユーザー定義のランタイム属性」に明示的に追加しない限り、nib ファイルはカスタム プロパティを認識しないため、カスタム プロパティを入力することはできません (iOS 5 以降)。 )。

ペン先の別のテクニックは、

@property (strong) IBOutletCollection(UIButton) NSArray *buttons;

そして、それに応じてボタンを反復およびカスタマイズします(サブクラス、カテゴリ、ローカルメソッドなどを介して...)。このメソッドは、少数のカスタム ボタンだけが必要な場合に非常に役立ちますが、サブクラスの使用を保証するには十分ではありません。

于 2013-08-01T22:39:08.933 に答える