我第一次在这里发布一个实际有效的代码!但是,我相信有一种方法可以减少代码中的行数。我希望大师可以告诉我的方式。
以下是故事板窗口供参考:
我有一个带有containerView的主ViewController。 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 :(得分: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 :(得分:2)
我认为这可以解决您的问题:
- (IBAction)B1Pressed:(id)sender
{
UINavigationController *navController = [self.childViewControllers objectAtIndex:0];
UIViewController *B1ViewController = [navController.viewControllers objectAtIndex:0];
[navController popToViewController:B1ViewController animated:YES];
}