2013-03-01 84 views
0

比方說,我有一個選項卡式應用程序,其中每個選項卡顯示不同類別的相似數據(例如Tab1:「Cat Pictures」,Tab2:「Dog Pictures」,Tab3:「Horse Pictures」等。 )。UIViewController子類策略

每個選項卡的視圖控制器都以相同的方式呈現數據。唯一的區別是vc的title屬性和提取數據的方法的參數。那麼,什麼是以下選項的利弊:

  • 與(有限)分支 邏輯爲每個類別創建一個視圖控制器主。

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

編輯

因此,爲了澄清 「是獲取數據的方法的參數」:抓取方法可能看起來像:

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

請說明「以及提取數據的方法的參數」。這些差異是什麼? – trojanfoe 2013-03-01 14:52:49

回答

0

短期項目:

  • 我會保留一個UIViewController數據源會改變(在這種情況下,那種圖片)

長期項目:

  • 我可能會子類,因爲你可能需要後增加的差異較小,現在創建的子類將節省您的一段時間之後。即使在短期項目中,您也可以使用這種方法。由於數據源是唯一發生變化的子類,因此大部分都是空的。
0

創建AbstractViewController擁有所有常見信息並具有所有方法。根據需要創建幾個ViewControllers,它們從super繼承,並用它們的行爲覆蓋函數。

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];  
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。L:

@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"]; 
... 
0

我不會繼承的。您可以創建一個視圖控制器,其中包含可在設置時更改的屬性,併爲每個選項卡創建一個實例。沒有什麼能阻止你創建一個視圖控制器的多個實例。一個視圖層次結構不需要一個視圖控制器。