2

鉴于:

  • 呈现 ViewController B 的 ViewController A
  • ViewController B没有对 ViewController A 的引用(除了隐含的presentingViewController属性)
  • ViewController B 调用dismiss自身,不执行任何其他操作

我想要达到的目标:

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

限制:

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

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

  • dismiss(animated:completion:) 根据文档将调用转发到其presentingViewController. 但似乎没有dismiss(animated:completion:)被调用,而是一个私有方法。_performCoordinatedPresentOrDismiss:animated:
  • iOS文档presentingViewController具有误导性。它说“呈现的视图控制器将此属性设置为呈现它的视图控制器”,但事实并非如此。在 iOS 11 中,这将始终指向present被调用的 VC 的根父 VC。同样,文档presentedViewController具有误导性。它说“调用该方法的视图控制器将此属性设置为它呈现的视图控制器”,这不是全部。调用的 VC(其所有父 VC 和子 VC)层次结构中的每个 VC 都present将指向同一个presentedViewController.
4

2 回答 2

0

在您的控制器 A 中,将其命名为UINavigationControllerDelegatenavigationController:didShowViewController标记控制器 B ( isControllerBisPresented = true) 的表示。当viewDidAppearB 时,检查是否isControllerBisPresented为真。

于 2017-11-17T19:55:48.497 回答
0

一个丑陋的解决方法是使用中间人在deinit. 因此,A呈现作为 childVCM嵌入的内容。BB解雇自己时,M也会被隐式解雇,所以应该调用它的deinit方法。在那里它可以通知它已被解雇。A

这是脆弱的,因为某些参考周期可能会阻止M被释放,这会导致A没有得到通知。所以我宁愿想找到一个更好的解决方案。

于 2017-11-20T11:12:50.517 回答