假设我有一个标签式应用程序,其中每个标签显示不同类别的相似数据(例如,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
...
}
答案 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)
我根本不会继承。您可以创建一个视图控制器,其属性可以在设置时更改,并为每个选项卡创建一个实例。没有什么可以阻止您创建视图控制器的多个实例。一个视图层次结构不需要一个视图控制器。