在转至子 uiviewcontroller ios 后关闭自己的 uiviewcontroller?

Close own uiviewcontroller after segue to child uiviewcontroller ios?

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

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

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

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

有什么想法吗?提前谢谢了。

When C closes, I want it to always return to A, i.e. it automatically closes B upon closing C, if opened from B

最简单的解决方案是:在C 的viewDidAppear: 中,偷偷删除B 作为导航控制器的子级。换句话说,你得到了这个:

A > B > C

现在你重新排列一下,这样你就得到了:

A > C

因此,从C返回的唯一的东西就是A。

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

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

dismissViewControllerAnimated:completion: 用于取消 模态转场 并且对 推送转场

没有影响

正如@matt 所建议的那样,您可以从 self.navigationController.viewControllers 中删除 B(中间)视图控制器,这里是您可以放入 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
    }
}

P.S. 如果您不打算使用 popViewControllerAnimated: 而不是 Unwind segue发回数据。