web-dev-qa-db-ja.com

UIButtonをサブクラス化しないのはなぜですか?

UIButtonのサブクラス化に関するスタックオーバーフローに関するいくつかの質問をしましたが、数人からUIButtonをサブクラス化すべきではないと通知されました。

UIButtonをサブクラス化することのマイナス面は何ですか?そして、私はそれが曖昧であることを知っていますが、UIButtonをサブクラス化する他の選択肢は何ですか?

34
SirRupertIII

Cocoaフレームワークは、オブジェクト構成パターンが従来のクラス階層よりも適切であるというアプローチを採用しています。

一般的に、これは、ボタンのさまざまな側面を処理する別のオブジェクトを設定できるUIButtonのプロパティがある可能性が高いことを意味します。これは、ボタンの動作を「カスタマイズ」するための好ましい方法です。

このパターンの主な理由の1つは、多くのライブラリコンポーネントがボタンを作成し、サブクラスのインスタンスを作成する必要があることを知らないことです。

編集、独自のファクトリーメソッド

アプリの多くのボタンに同じボタン設定がある場合の時間の節約についての上記のコメントに気付きました。これはFactory Methodデザインパターンを使用する絶好の機会です。Objective-Cでは、 Categoryで実装 できるため、UIButtonで直接使用できます。

@interface UIButton ( MyCompanyFactory )
+(UIButton *) buttonWithMyCompanyStyles;
@end
@implementation UIButton
+(UIButton *) buttonWithMyCompanyStyles {
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom];
    // [theButton set...
    return theButton;
}
@end
36
Chris Trahey

UIButtonは、いくつかの複雑さ/微妙さ/制限があるという点で特別です(つまり、定義するための追加のオーバーライド、特に+buttonWithType:)期待どおりに機能するために必要です。通常の-initWithFrame:(および-initWithCoder:(XIBで使用される場合)。 IDKが、フレームワークの作成者がこれらの詳細を私たちのドメインに漏らすことを許可した理由ですが、今私たちが対処しなければならないものです。制限は、実装が事前設定されたシステムボタンスタイルに依存(拡張)してはならないことです。 UIButtonTypeCustomサブクラスの開始点としてUIButtonを想定する必要があります。


UIButtonのサブクラスの実装時

15
justin

独自の「サブビュー」でより軽量なものを探している場合は、代わりにUIControlをサブクラス化する必要があります。 UIButtonはUIControlをサブクラス化し、次のようなイベントを処理できます。

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];

UIControlはUIViewをサブクラス化するため、UIControlサブクラスに含まれる任意のビューのレイアウトサブビューをきれいにレイアウトし、UIButtonに付属する不要なビューを回避できます。本質的には、独自の「UIButton」を作成するだけですが、実際に必要としない動作や機能を回避する必要はありません。

11