2013-03-01 49 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

我不会继承的。您可以创建一个视图控制器,其中包含可在设置时更改的属性,并为每个选项卡创建一个实例。没有什么能阻止你创建一个视图控制器的多个实例。一个视图层次结构不需要一个视图控制器。