0

各タブに類似したデータの異なるカテゴリが表示されるタブ付きアプリケーションがあるとします (例: タブ 1:「猫の写真」、タブ 2:「犬の写真」、タブ 3:「馬の写真」など)。

各タブのビュー コントローラーは、同じようにデータを表示します。唯一の違いは、vc の title プロパティと、データをフェッチするメソッドのパラメーターです。したがって、次のオプションの長所と短所は何ですか。

  • カテゴリごとに (制限付きの) 分岐ロジックを持つ 1 つの ViewController マスターを作成します。

  • ViewController スーパークラスと、さまざまなカテゴリ タイプのいくつかのサブクラスを作成します。

編集

したがって、「データを取得するメソッドのパラメーター」を明確にするために、取得メソッドは次のようになります。

-(void)fetchDataForType:(NSString*)type {
       if ([type isEqual:@"cat"])
           // fetch cat pics
       if ([type isEqual:@"dog"])
           // fetch dog pics
       ...
 }
4

5 に答える 5

1

あなたの場合、私はサブクラス化さえしません。変更するプロパティを持つ 1 つのクラスを作成し、異なるプロパティ値でインスタンス化します。

大まかな例:

@interface ViewController : UIViewController
@property (retain, nonatomic) NSString *title;
- (void)getJSONWithParams:(NSDictionary *)params;
@end

インスタンス:

ViewController *controller1 = [[ViewController alloc] init];
controller1.title = @"First";
NSDictionary *params1 = @{@"url":@"http://graph.facebook.com", @"query":@"q=somethingInFacebook"};
[self.navigationController pushViewController:controller1];
[controller1 getJSONWithParams:params1];

ViewController *controller2 = [[ViewController alloc] init];
controller2.title = @"Second";
NSDictionary *params2 = @{@"url":@"http://api.twitter,com", @"query":@"q=somethingInTwitter"};
[self.navigationController pushViewController:controller2];
[controller2 getJSONWithParams:params2];    
于 2013-03-01T15:04:22.507 に答える
0

私はまったくサブクラス化しません。セットアップ時に変更できるプロパティを持つビュー コントローラーを 1 つ作成し、タブごとにインスタンスを作成します。ビュー コントローラーの複数のインスタンスを作成することを妨げるものは何もありません。1 つのビュー階層に 1 つのビュー コントローラーは必要ありません。

于 2013-03-01T15:29:46.953 に答える
0

短期プロジェクト:

  • UIViewControllerデータ ソースが変更される場所 (この場合は写真の種類) を保持します。

長期プロジェクト:

  • 後で小さな違いを追加する必要があるかもしれませんが、サブクラスを作成すると、後で時間を節約できるため、おそらくサブクラス化します。短期間のプロジェクトでも、このアプローチを使用できます。変更されるのはデータ ソースだけなので、サブクラスはほとんど空になります。
于 2013-03-01T14:55:15.397 に答える
0

CreateAbstractViewControllerはすべての共通情報を保持し、すべてのメソッドを備えています。必要に応じていくつか作成しViewControllers、それらは から継承し、superその動作で関数をオーバーライドします。

于 2013-03-01T14:58:06.037 に答える
0

単一の UIViewController サブクラスで、必要なものすべてを提供できると思います。それぞれの異なるタイプの画像をサポートするために必要な違いを提供するだけです。これらの違いは、表示される画像の説明とタイプにすぎないと仮定しましょう。

MyViewController.h:

@MyViewController : UIViewController

@property (strong, nonatomic) NSString *description;
@property (strong, nomatomic) NSString *type;

// Designated initializer
- (id)initWithNibName:(NSString *)nibName
               bundle:(NSBundle *)nibBundle
          description:(NSString *)description
                 type:(NSString *)type;

@end

MyViewController.m:

@implementation MyViewController

 - (id)initWithNibName:(NSString *)nibName
                bundle:(NSBundle *)nibBundle
           description:(NSString *)description
                  type:(NSString *)type
{
    self = [super initWithNibName:nibName bundle:nibBundle];
    if (self != nil)
    {
        self.description = description;
        self.type = type;
    }
    return self;
}

- (NSArray *)fetchPics
{
    NSMutableArray *pics = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.somewhere.com/fetchPics?type=%@", self.type]];
    ...

    return pics;
}

@end

そして、必要に応じてView Controllerを作成するだけのケースになるはずです:

MyViewController *catVC = [[MyViewController alloc] initWithNibNamed:@"Something" bundle:nil description:@"Cats" type:@"cat"];
...
于 2013-03-01T15:27:56.173 に答える