0

我在导航控制器中有三个 UIViewController(我们称它们为 A、B 和 C)。A 可以转入 B 或 C。B 可以转入 C。当 C 关闭时,我希望它始终返回 A,即如果从 B 打开,它会在关闭 C 时自动关闭 B。

现在,我尝试使用 segue unwinding,这样当 C 关闭时,B 的返回方法被调用以关闭目标控制器:

- (IBAction)returnFromC:(UIStoryboardSegue*)segue
{
    [segue.destinationViewController dismissViewControllerAnimated:YES completion:nil];
}

我在这个方法中放了一个断点——它被调用了。我已经验证了destinationController 确实是B。但是,我注意到当断点命中时,C 仍然可见。从断点开始播放后,C 确实按预期退出,但 B 仍然可见。

有任何想法吗?提前谢谢了。

4

2 回答 2

3

当 C 关闭时,我希望它始终返回到 A,即如果从 B 打开,它会在关闭 C 时自动关闭 B

最简单的解决方案是:在 C'sviewDidAppear:中,偷偷移除 B 作为导航控制器的子级。换句话说,你有这个:

A > B > C

现在你重新排列东西,这样你就得到了:

A > C

因此,唯一可以从 C 返回的就是 A。

以这种方式很容易操纵导航控制器的子集。只需调用setViewControllers:animated:(第二个参数为 NO)。

[但是,如果我正确理解了您的设置,另一种简单的方法是在 A 而不是 B 中实现 unwind 方法。然后进行 unwind segue。我们总是展开到包含 unwind 方法的第一个视图控制器,所以它总是 A。]

于 2015-01-23T03:09:45.437 回答
0

dismissViewControllerAnimated:completion:用于解除Modal segue,对Push segue 无效

正如@matt 建议的那样,您可以从中删除 B (中间)视图控制器self.navigationController.viewControllers,这是您可以放入 B 视图控制器的示例代码:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    // No need to process if the viewController is already being removed
    if (!self.isMovingFromParentViewController) {
        // Getting a mutable copy of the viewControllers (can't directly modify)
        NSMutableArray *temp = [self.navigationController.viewControllers mutableCopy];

        // Removing 'self' -> so A > B > C will become A > C
        [temp removeObject:self];

        // Setting the new array of viewControllers
        self.navigationController.viewControllers = [temp copy]; // getting an immutable copy
    }
}

PS如果您不打算发回数据,则可以使用Unwind seguepopViewControllerAnimated:代替。

于 2015-01-23T03:50:53.163 回答