2013-02-09 165 views
0

第一次我在這裏發佈一個問題,其中包含實際可用的代碼!但是,我相信有一種方法可以減少代碼中的行數。我希望上師能指引我。重構iOS代碼:減少代碼行數

這裏是故事板窗口以供參考:

enter image description here

我有一個主視圖控制器與containerView。 ContainerView擁有自己的導航控制器。主視圖控制器左邊的每個按鈕(B1-B5)塞格的相應場景編號。即B2將場景2推到堆棧上。 B4將場景4推到堆疊上。如果visibleViewContoller是場景5,並且用戶按下B1,它將彈出所有viewController,直到我們到達場景1爲止。等等等等。

再次跌破代碼工作正常,我只是希望縮小代碼的大小爲B1和B2:

- (IBAction)B1Pressed:(id)sender { 

UINavigationController *navController = [self.childViewControllers objectAtIndex:0]; 
NSMutableArray *VCs = [navController.viewControllers mutableCopy]; 
UIViewController *visibleViewController = [navController visibleViewController]; 

if (visibleViewController == [VCs objectAtIndex:0]) 
{ 
    return; 
} 
else if (visibleViewController ==[VCs objectAtIndex:1]) 
{ 
    [navController popViewControllerAnimated:YES]; 
} 

else if (visibleViewController ==[VCs objectAtIndex:2]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 
} 

else if (visibleViewController ==[VCs objectAtIndex:3]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 

} 
else if (visibleViewController ==[VCs objectAtIndex:4]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 

} 
else if (visibleViewController ==[VCs objectAtIndex:5]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 

    } 
} 

- (IBAction)B2Pressed:(id)sender { 

UINavigationController *navController = [self.childViewControllers objectAtIndex:0]; 
NSMutableArray *VCs = [navController.viewControllers mutableCopy]; 
UIViewController *visibleViewController = [navController visibleViewController]; 

if (visibleViewController == [VCs objectAtIndex:0]) 
{ 
    STLMEatDrinkViewController *stlmEDVC = [self.storyboard instantiateViewControllerWithIdentifier:@"B2"]; 
    [navController pushViewController:stlmEDVC animated:YES]; 
} 
else if (visibleViewController ==[VCs objectAtIndex:1]) 
{ 
    return; 
} 

else if (visibleViewController ==[VCs objectAtIndex:2]) 
{ 
    [navController popViewControllerAnimated:YES]; 
} 

else if (visibleViewController ==[VCs objectAtIndex:3]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 

} 
else if (visibleViewController ==[VCs objectAtIndex:4]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 

} 
else if (visibleViewController ==[VCs objectAtIndex:5]) 
{ 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:NO]; 
    [navController popViewControllerAnimated:YES]; 
} 
} 

現在想象寫相同的代碼三次爲B3Pressed,B4Pressed和B5Pressed。我認爲這是太多的代碼,我幾乎肯定有一個更好的方法來做到這一點。

謝謝。

+0

也許更適合於[代碼審查(http://codereview.stackexchange.com/) – 2013-02-09 22:00:43

回答

2

1.)您不得使用==來比較對象。使用isEqual:

2.)循環。

int idx = [VCs indexOfObject:visibleViewController]; 

if (idx == 0) { 
    STLMEatDrinkViewController *stlmEDVC = [self.storyboard instantiateViewControllerWithIdentifier:@"B2"]; 
    [navController pushViewController:stlmEDVC animated:YES]; 
} else if (idx == 1) { 
    return; 
} else { 
    int i; 
    for (i = 2; i < idx; i++) { 
     [navController popViewControllerAnimated:NO]; 
    } 

    [navController popViewControllerAnimated:YES]; 
} 
+1

使用對象的比較==是這一優良情況下,我們期待從字面上看,同一個對象不是我們? – jrturton 2013-02-09 22:11:53

+1

@jrturton從技術上講,它很有用,但它通常被認爲是不好的風格(我想不出任何'=='不會起作用的場合)。 – 2013-02-09 22:18:38

+0

[引用需要];) – jrturton 2013-02-09 22:20:14

2

我覺得這回答您的問題:

- (IBAction)B1Pressed:(id)sender 
{ 
    UINavigationController *navController = [self.childViewControllers objectAtIndex:0]; 
    UIViewController *B1ViewController = [navController.viewControllers objectAtIndex:0]; 
    [navController popToViewController:B1ViewController animated:YES]; 
}