2013-02-09 60 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]; 
}