2015-06-13 54 views
0

我有一個應用程序與四個viewControllers,並有很多代碼重複完全相同的方式在四個視圖控制器,我想知道什麼是最好的OOP方式來編寫此代碼只有一次和在其他視圖控制器中重用它。如何以面向對象的方式重用此ViewController代碼?

這是從我的第一視圖控制器viewDidLoad中的代碼:

- (void)viewDidLoad { 

[super viewDidLoad]; 
[self setCanDisplayBannerAds:YES]; 

[[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem]setImage:[UIImage imageNamed:@"iconoBota30x30.png"]]; 
[[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem]setImage:[UIImage imageNamed:@"actividades.png"]]; 
[[[self.tabBarController.viewControllers objectAtIndex:3] tabBarItem]setImage:[UIImage imageNamed:@"nosotros.png"]]; 


float width = [UIScreen mainScreen].bounds.size.width; 

float height = [UIScreen mainScreen].bounds.size.height; 

static_iVar = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, width,height)]; 
static_iVar.delegate = self; 
NSURL *url = [NSURL URLWithString:@"http://guiasdelsur.es"]; 
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
[static_iVar loadRequest:requestObj]; 
[self.view addSubview:static_iVar]; 


//GESTURES 

//DOWN 
UISwipeGestureRecognizer *gest1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideTabBar:)]; 
gest1.delegate = self; 
[gest1 setDirection:UISwipeGestureRecognizerDirectionDown]; 
[self.view addGestureRecognizer:gest1]; 

//UP 
UISwipeGestureRecognizer *gest2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showTabBar:)]; 
gest2.delegate = self; 
[gest2 setDirection:UISwipeGestureRecognizerDirectionUp]; 
[self.view addGestureRecognizer:gest2]; 


//first tab 

_tabInicio = [[UITabBarItem alloc] initWithTitle:@"Inicio" image:[UIImage imageNamed:@"d.png"] tag:0]; 

[[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]]; 
[self.tabBarController setSelectedIndex:0]; 

self.tabBarItem = _tabInicio; 




_cToolBar = [[UIToolbar alloc] init]; 
_cToolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44); 
NSMutableArray *items = [[NSMutableArray alloc] init]; 


[_cToolBar setBarStyle:UIBarStyleBlack]; 
[_cToolBar setTranslucent:YES ]; 
[_cToolBar setTintColor:[UIColor greenColor]]; 


// Do any additional setup after loading the view, typically from a nib. 


NSString *backArrowString = @"\U000025C0\U0000FE0E Atrás"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR 
UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStyleDone target:nil action:@selector(goBack)]; 


UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:nil action:@selector(refreshControl)]; 
[right setTintColor:[UIColor greenColor]]; 

UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 


[items addObject:back]; 
[items addObject:flexibleSpace]; 
[items addObject:right]; 



[_cToolBar setItems:items animated:NO]; 

[self.view addSubview:_cToolBar]; 


//iAD 

ADBannerView * adView = [[ADBannerView alloc] initWithFrame:CGRectZero]; 
adView.frame = CGRectOffset(adView.frame, 0, 44); 
adView.delegate = self; 
[self.view addSubview:adView]; 



//loading indicator 
_indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[_indicator setCenter:self.view.center]; 
[_indicator setHidesWhenStopped:YES]; 
[self.view addSubview:_indicator]; 
[_indicator startAnimating]; 
} 

這是從viewDidLoad方法的代碼我secondViewController,非常類似於第一個。所有我的視圖控制器中的差異都與那些相同。

- (void)viewDidLoad  { 
    [super viewDidLoad]; 
    [self setCanDisplayBannerAds:YES]; 
    float width = [UIScreen mainScreen].bounds.size.width; 

    float height = [UIScreen mainScreen].bounds.size.height; 
    static_iVar2 = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, width,height)]; 

    static_iVar2.delegate = self; 
    NSURL *url = [NSURL URLWithString:@"http://guiasdelsur.es/category/programas/"]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
    [static_iVar2 loadRequest:requestObj]; 
    [self.view addSubview:static_iVar2]; 



    //second tab 

    _secondTab = [[UITabBarItem alloc] initWithTitle:@"Programas" image:[UIImage imageNamed:@"iconoBota30x30.png"] tag:1]; 

    [[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]]; 
    [self.tabBarController setSelectedIndex:1]; 
    self.tabBarItem = _secondTab; 




    //GESTURES 

    //DOWN 
    UISwipeGestureRecognizer *gest1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideTabBar:)]; 
    gest1.delegate = self; 
    [gest1 setDirection:UISwipeGestureRecognizerDirectionDown]; 
    [self.view addGestureRecognizer:gest1]; 

    //UP 
    UISwipeGestureRecognizer *gest2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showTabBar:)]; 
    gest2.delegate = self; 
    [gest2 setDirection:UISwipeGestureRecognizerDirectionUp]; 
    [self.view addGestureRecognizer:gest2]; 



    UIToolbar *cToolBar = [[UIToolbar alloc] init]; 
    cToolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44); 
    NSMutableArray *items = [[NSMutableArray alloc] init]; 


    [cToolBar setBarStyle:UIBarStyleBlack]; 
    [cToolBar setTranslucent:YES ]; 
    [cToolBar setTintColor:[UIColor greenColor]]; 

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil ]; 

    UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:nil action:@selector(refreshControl)]; 
    [right setTintColor:[UIColor greenColor]]; 


    [items addObject:flexibleSpace]; 
    [items addObject:right]; 




    [cToolBar setItems:items animated:NO]; 
    [self.view addSubview:cToolBar]; 

    //iAD 

    ADBannerView * adView = [[ADBannerView alloc] initWithFrame:CGRectZero]; 
    adView.frame = CGRectOffset(adView.frame, 0, 44); 
    adView.delegate = self; 
    [self.view addSubview:adView]; 


    //Indicator 


    _indicador = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [_indicador setCenter:self.view.center]; 
    [_indicador setHidesWhenStopped:YES]; 

    [self.view addSubview:_indicador]; 
    [_indicador startAnimating]; 

} 

回答

2

重構此代碼是一個非常好的主意;它是DRY的一個例子。在這種情況下,最好的方法是使用繼承:寫下ViewController類中的所有公共代碼,例如

ViewController.h

@interface ViewController : UIViewController { 
    // Variables which are declared here can also be used in the subclasses 
} 

ViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self setCanDisplayBannerAds:YES]; 
    // more common code 
    ... 
} 

,讓你的其他視圖控制器從ViewController(而不是UIViewController)繼承:

FirstViewContr oller.h

@interface FirstViewController : ViewController 
... 

FirstViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // more specific code 
    [[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem]setImage:[UIImage imageNamed:@"iconoBota30x30.png"]]; 
    [[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem]setImage:[UIImage imageNamed:@"actividades.png"]]; 
    [[[self.tabBarController.viewControllers objectAtIndex:3] tabBarItem]setImage:[UIImage imageNamed:@"nosotros.png"]]; 
    ... 
}