![](/img/trans.png)
[英]Swift UIViewController subclass instance variable initialization strategy
[英]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.