你怎麼想的代碼提取到一個更可重複使用形式完全取決於視圖控制器的性質。
如果所有的視圖控制器都顯示了類似的概念,都包括一個標誌,我建議創建一個視圖控制器超:
@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的最高格式,所以謹慎使用子類化。如果子類沒有意義,請使用演示者方法。
+1非常感謝您展示其他方面。目前我離開了我的Mac,我會嘗試重構代碼並讓你知道。從你的回答中學到更多新東西,需要谷歌:) – Praveen
很高興幫助:)。我想我只是想強調,如果你想要可維護的代碼,保持一個可理解的代碼心智模型是最高優先級。簡單的心理模型使其他人或你自己在幾個月內更容易瞭解代碼並理解它。 – drewag