簡體   English   中英

UIViewController子類策略

[英]UIViewController subclass strategy

假設我有一個選項卡式應用程序,其中每個選項卡顯示不同類別的相似數據(例如Tab1:“貓圖片”,Tab2:“狗圖片”,Tab3:“馬圖片”等)。

每個選項卡的視圖控制器均呈現相同的數據。 唯一的區別是vc的title屬性和獲取數據的方法的參數。 那么以下選項的優缺點是什么:

  • 為每個類別創建一個具有(有限)分支邏輯的ViewController母版。

  • 為不同的類別類型創建一個ViewController超類和幾個子類。

編輯

因此,為了澄清“獲取數據的方法的參數”:提取方法可能類似於:

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

在您的情況下,我什至不會繼承。 創建一個具有要更改的屬性的類,並使用不同的屬性值實例化。

粗略的例子:

@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];    

短期項目:

  • 我將保留一個UIViewController ,其中數據源將更改(在這種情況下為圖片類型)

長期項目:

  • 我可能會使用子類,因為您可能需要在添加小差異之后立即創建子類,這樣可以節省一些時間。 即使在短期項目中,您也可以使用這種方法。 由於數據源是唯一更改的,因此子類將大部分為空。

Create AbstractViewController包含所有公共信息並具有所有方法。 根據需要創建幾個ViewControllers ,它們從super和重寫函數繼承而來。

我相信一個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

然后,它只是在必要時創建視圖控制器的一種情況:

MyViewController *catVC = [[MyViewController alloc] initWithNibNamed:@"Something" bundle:nil description:@"Cats" type:@"cat"];
...

我根本不會繼承。 創建一個具有可以在設置時更改的屬性的視圖控制器,並為每個選項卡創建一個實例。 沒有什么可以阻止您創建視圖控制器的多個實例。 一個視圖層次結構不需要一個視圖控制器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM