【问题标题】:Refactoring iOS code: Decreasing the number of lines of code重构 iOS 代码:减少代码行数
【发布时间】:2013-02-09 21:57:13
【问题描述】:

我第一次在这里发布一个带有实际工作代码的问题!但是,我相信有一种方法可以减少代码行数。希望有大神给我指路。

这是供参考的故事板窗口:

我有一个带有 containerView 的 Main 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 再编写 3 次相同的代码。我认为代码太多了,我几乎肯定有更好的方法来解决这个问题。

谢谢。

【问题讨论】:

标签: ios optimization coding-style refactoring


【解决方案1】:

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];
}

【讨论】:

  • 在这种情况下使用 == 比较对象没问题,我们期待字面上是同一个对象,不是吗?
  • @jrturton 从技术上讲它是可行的,但它通常被认为是糟糕的风格(不过,我想不出任何== 不起作用的场合)。
  • @H2CO3。那是快速而美丽的!你的代码就像一个魅力!谢谢。
  • @ToMfromTO 您的代码导致异常:Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'我相信那是因为我需要通过弹出和推送来浏览 UINavigationController。直接访问它们不起作用,因为视图尚未初始化(我在想),我可能是错的。但是谢谢你的尝试。 ——
  • @user1107173 你的推论实际上是完全错误的。阅读错误信息。只是 ToMfromTO 试图懒惰地过度简化任务。他的代码中没有任何ifs - 它们是必需的。除了我所做的之外,您无法真正简化此代码。
【解决方案2】:

我认为这可以解决您的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多