2

iPhoneとiPadの両方でユニバーサルアプリを開発する場合、同じビューコントローラーを再利用することがよくあります。ただし、次のようなカスタマイズが必要になることがよくあります。

IF iPad THEN 
  ...
ELSE
  ...

したがって、このようなカスタマイズを実現するために、コントローラーには、コントローラーの初期化中に設定されるプロパティがある場合や、カスタムコンストラクターがある場合があります。そのような状況に適したデザインパターンがあるのは興味深いことです。

4

3 に答える 3

4

しないでください....:)たとえばMyClassと呼ばれる共通のクラスを使用し、それをサブクラス化して、それぞれに2つの異なるXIBを使用しますMyClass-iPadMyClass-iPhoneこの種のものの使用は避けてください(必要はありません)。

説明:

Something-iPadiPadバージョンは、コードをクリーンにし、明確に定義されたアーキテクチャを作成するタイプのクラスのみを認識する必要があります。私があなたのコードに飛び込んで、誰かが私に言った場合:「OKジャッキーボーイ、あなたはiPadバージョンで変更を加えなければならない」。Something-iPhone私はクラスを見ても構わない。ロジック(ビジネス)のほとんどはスーパークラスSomethingにあり、小さな調整はサブクラスにある必要があります。

Something-iPhoneちなみに、私のプロジェクトのほとんどでは、設計はXIBで行われるため、通常、クラスには何もありません。Something-iPad私は通常、(単なる例)への参照を保持し、いくつUIPopOverControllerかの回転を微調整します。

編集1:

NSDictionary私は次のように、の初期化でを受け取りますUIViewController

initWithNibName:bundle:configurationDictionary:

このconfigurationDictionaryを受け取った後、viewDidLoad(たとえば)で使用します。次に、次のようなクールなことを行うことができます。

- (void)viewDidLoad
{
    [[self view] setBackgroundColor:[[self configurationDictionary] objectForKey:BACKGROUND_COLOR_KEY]];
}
于 2012-12-14T15:21:48.793 に答える
1

異なるイニシャライザーまたは異なる機能のより大きなチャンクがある場合は、コア機能を使用して基本クラスを定義し、次にiPad固有のサブクラスとiPhone固有のサブクラスを定義するのが理にかなっています。

ただし、わずかな違いしかない場合(たとえば、アクションシートを表示する場合)、次のようなものを使用します。

- (void)someMethod {
    // a bunch of stuff that is the same

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        // one or two lines for iPad
    } else {
        // one or two lines for iPhone
    }
}

私は両方を行う状況がたくさんあります-より大きな違いのためのサブクラスとUI_USER_INTERFACE_IDIOM基本クラスの些細な違いのための使用。

于 2012-12-14T15:31:45.520 に答える
1

Nか所で同じVCが必要であるが、毎回少しずつ異なる方法で初期化される場合は、VCの特定のファクトリクラス/カテゴリのロジックを移動します

たとえばSLRequestオブジェクトで行われるように/ShareKitで

于 2012-12-14T15:34:38.850 に答える