UIViewController子类策略

时间:2013-03-01 14:50:13

标签: ios objective-c cocoa-touch uiviewcontroller uikit

假设我有一个标签式应用程序,其中每个标签显示不同类别的相似数据(例如,Tab1:“猫图片”,标签2:“狗图片”,标签3:“马图片”等)。

每个选项卡的视图控制器以相同的方式呈现数据。唯一的区别是vc的title属性和获取数据的方法的参数。那么以下选项的优缺点是什么:

  • 使用(有限的)分支创建一个ViewController主控    每个类别的逻辑。

  • 创建一个ViewController    超类和不同类别类型的几个子类。

修改

所以澄清“获取数据的方法的参数”:fetch方法可能如下所示:

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

5 个答案:

答案 0 :(得分: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];    

答案 1 :(得分:0)

短期项目:

  • 我会保留一个UIViewController数据源会改变的位置(在这种情况下是图片类型)

长期项目:

  • 我可能会子类,因为你可能需要在之后添加较小的差异,现在创建子类会节省你一些时间。即使在短期项目中,您也可以使用这种方法。由于数据源是唯一发生变化的,因此子类大部分都是空的。

答案 2 :(得分:0)

创建AbstractViewController包含所有常见信息并拥有所有方法。根据需要创建多个ViewControllers,它们继承super并覆盖函数及其行为。

答案 3 :(得分: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

然后它应该只是在必要时创建视图控制器的情况:

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

答案 4 :(得分:0)

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