如何通知PresentingViewController其PresentedViewController自行解散?

时间:2017-11-17 12:31:08

标签: ios uiviewcontroller coordinator-pattern

假设:

  • ViewController A呈现ViewController B
  • ViewController B对ViewController A 无引用(隐式presentingViewController属性除外)
  • ViewController B自己调用dismiss而不执行任何其他操作

我想要实现的目标:

  • ViewController A想知道ViewController B何时被解散以清理状态

限制:

  • 我不想使用KVO
  • 我不想以任何方式修改ViewController B或其行为

到目前为止我发现了什么:

  • dismiss(animated:completion:) according to the documentation将呼叫转发给presentingViewController。但似乎dismiss(animated:completion:) 被调用,而是私有方法_performCoordinatedPresentOrDismiss:animated:
  • iOS documentation on presentingViewController具有误导性。它说“所呈现的视图控制器将此属性设置为呈现它的视图控制器”,但事实并非如此。在iOS 11中,这将始终指向调用present的VC的根父VC。同样地,documentation on presentedViewController具有误导性。它说“调用方法的视图控制器将此属性设置为它所呈现的视图控制器”,这不是整个故事。调用present的VC(其所有父VC和子VC)层次结构中的每个VC都将指向相同的presentedViewController

2 个答案:

答案 0 :(得分:0)

在您的控制器A中,将其标记为UINavigationControllerDelegate并使用navigationController:didShowViewController标记控制器B(isControllerBisPresented = true)的显示。当B的viewDidAppear时,请检查isControllerBisPresented是否为真。

答案 1 :(得分:0)

一个丑陋的解决方法是使用在deinit中执行某项操作的中间人。因此A显示MB嵌入为childVC。当B自行解散时,M也会被隐式解雇,因此deinit方法应该被调用。在那里它可以通知A它被解雇了。

这很脆弱,因为某些参考周期可能会阻止M被解除分配,从而导致A无法收到通知。所以我宁愿找到更好的解决方案。