2014-03-29 30 views
1

我一直在經歷一個IOS項目,在該項目中,我找到了多個viewController中使用的相同代碼集。如何在多個viewController中重用組件?

實施例:

xxxxViewController.m

UIImageView *logoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(90, 12, 133, 62)]; 
logoImageView.image = [UIImage imageNamed:@"logo"]; 
[self.view addSubview:logoImageView]; 

yyyyViewController.m

UIImageView *logoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(90, 12, 133, 62)]; 
logoImageView.image = [UIImage imageNamed:@"logo"]; 
[self.view addSubview:logoImageView]; 

類似地,對於3+ viewController.m文件。這是我的問題,我們如何在整個IOS項目中重用這段代碼,我無法弄清楚。

回答

1

你怎麼想的代碼提取到一個更可重複使用形式完全取決於視圖控制器的性質。

如果所有的視圖控制器都顯示了類似的概念,都包括一個標誌,我建議創建一個視圖控制器超:

@interface MyViewControllerWithLogo : UIViewController 
@end 

@implementation 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIImageView *logoImageView = [[UIImageView alloc]initWithFrame:CGRectMake(90, 12, 133, 62)]; 
    logoImageView.image = [UIImage imageNamed:@"logo"]; 
    [self.view addSubview:logoImageView]; 
} 
@end 

如果視圖控制器顯示不同的概念,但它們包含的意見的同類型的對象,你可以創建一個UIView子類和使用,無論你需要用標誌的觀點:

@interface MyViewWithLogo : UIView 
@end 

@implementation 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setupViews]; 
    } 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self setupViews]; 
    } 
    return self; 
} 

- (void)setupViews 
{ 
    UIImageView *logoImageView = [[UIImageView alloc]initWithFrame:CGRectMake(90, 12, 133, 62)]; 
    logoImageView.image = [UIImage imageNamed:@"logo"]; 
    [self.view addSubview:logoImageView]; 
} 
@end 

其他常見的方法是不會真正節省您的任何代碼,只讓問題更加複雜。另一種方法將包括使用演示者對象,該對象將視圖添加到您要在每個視圖控制器中實例化的標識中。

@interface LogoPresenter : NSObject 
    - (void)addLogoToView:(UIView *)view; 
@end 

@implementation 
- (void)addLogoToView:(UIView *)view 
{ 
    UIImageView *logoImageView = [[UIImageView alloc]initWithFrame:CGRectMake(90, 12, 133, 62)]; 
    logoImageView.image = [UIImage imageNamed:@"logo"]; 
    [view addSubview:logoImageView]; 
} 
@end 

@implementation AViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    LogoPresenter *presenter = [LogoPresenter new]; 
    [presenter addLogoToView:self.view]; 
} 
@end 

你需要考慮的重點是在任何特定的地方做子類是合乎邏輯的。它們是coupling的最高格式,所以謹慎使用子類化。如果子類沒有意義,請使用演示者方法。

+0

+1非常感謝您展示其他方面。目前我離開了我的Mac,我會嘗試重構代碼並讓你知道。從你的回答中學到更多新東西,需要谷歌:) – Praveen

+1

很高興幫助:)。我想我只是想強調,如果你想要可維護的代碼,保持一個可理解的代碼心智模型是最高優先級。簡單的心理模型使其他人或你自己在幾個月內更容易瞭解代碼並理解它。 – drewag

1

您可以創建一個LogoImageView類(UIImageView的子類),該類被配置爲如何使用它。然後你可以在需要的地方添加它。


LogoImageView.h:

#import <UIKit/UIKit.h> 

@interface LogoImageView : UIImageView 

+ (UIImageView *)defaultView; 

@end 

LogoImageView.m:

@implementation LogoImageView 

- (id)init { 
    self = [super initWithFrame:CGRectMake(90, 12, 133, 62)]; 
    if (self){ 
     self.image = [UIImage imageNamed:@"logo"]; 
    } 
    return self; 
} 

+ (UIImageView *)defaultView { 
    return [[self alloc] init]; 
} 

@end 

而且你可以在任何地方使用它像這樣(請確保您導入LogoImageView.h):

[view addSubview:[LogoImageView defaultView]]; 
+0

+1非常感謝..多一個問題;我是否可以將它更改爲具有多個可重用組件的實用程序以及類似於此「LogoImageView」類中的「UIImageView」的函數? – Praveen

+0

我想說,你想要重用每個組件的子類,這就是我在大多數項目中所做的。或者,您可以創建一個構建所需組件(按鈕,圖像視圖等)的單個類(Factory),但我會說這種方法有點麻煩。 –

+2

我應該做的另外一點是,在這種默認圖像視圖中設置框架的x和y座標可能不是最好的。 x和y座標很可能取決於圖像視圖容器的尺寸。最好在超級視圖中重寫'layoutSubviews'來定位組件。 –

0

您可以創建一個名爲LogoViewController的超類,並將徽標圖像視圖設置爲它的一個屬性。然後將所有設置代碼移到viewDidLoad,或者適當的地方。然後所有其他視圖控制器可以繼承它,當它們調用[super viewDidLoad]時,它們將獲得徽標設置代碼。

1

您可以創建UIView的類別,它可以添加子視圖:

-(void)addLogo { 
    UIImageView *logoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(90, 12, 133, 62)]; 
    logoImageView.image = [UIImage imageNamed:@"logo"]; 
    [self addSubview:logoImageView]; 
} 

,每當你想添加的標誌,你可以撥打:

[self.view addLogo]; 
+0

這意味着像創建一個函數並在需要時調用它。對? +1雖然有效的點我希望有更有效的方法。 – Praveen

+0

不,我的意思是類別 - 這是一種可以將新方法添加到現有類中的方法。谷歌它,它很容易創建它。 – Greg

+0

我不認爲有一個強大的用例添加到UIView類。最好創建一個單獨的類來添加徽標,這樣您就不必擔心可能會覆蓋現有方法,或與可能最終添加的其他庫衝突。 – drewag

相關問題