Ian*_*Ian 6

为什么和如何

让我们说,视图控制器A已经呈现了B,而B则依次呈现了C.

当你打电话时dismissViewControllerAnimated:completion:,iOS会检查你正在调用它的视图控制器是否在其presentedViewController属性中有一个子节点.如果确实如此,那么它会解散该控制器.

因此,如果我在我们的例子中在B上调用它,它就会解散C,但是如果我在A上调用它,它会解散B(它会带走C).

如果我在C上调用它,那么它没有孩子.然后iOS检查presentingViewController属性.如果设置了,则要求关闭其控制器.因此,如果我在C上调用它,iOS会将请求发送回B,这会解除C.

所以在B或C上调用该方法将摆脱C,而在A上调用它将摆脱B和C.

最佳实践

每次都在B上,在所呈现的东西上调用它.这是

  1. 不那么混乱,因为你的现在和解雇将在同一个地方,并且

  2. 更多的未来证明,因为在未来的某个时候你可能会让C出现另一个视图控制器(D),然后解雇会突然中断(它会突然开始解雇D,而不是解雇自己).