【问题标题】:Send message to parentViewController after dismissing UIViewController关闭 UIViewController 后向 parentViewController 发送消息
【发布时间】:2013-09-11 03:09:14
【问题描述】:

这对你们中的一些人来说应该很简单。

我正在消除由另一个 UIViewController 从自身内部模态呈现的 UIViewController。我正在使用

[self dismissViewControllerAnimated:YES
                         completion:^{
    // Want to access presentingViewController here.
}];

我尝试记录selfnavigationControllerparentViewControllerpresentingViewController,但它们都返回null

Apple 的文档说:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。

据此,消息被发送到presentingViewController。我想知道如何捕捉这个消息。是否有委托调用,或者我该如何查找presentedViewController 是否被解雇。

【问题讨论】:

  • 我在这里有点困惑。您有一个由“控制器 B”呈现的视图控制器(称为控制器 A)。而你正在调用 [selfdismissViewController...];在控制器 B 中形成,对吧?但是,当这完成后,您想访问控制器 B 的呈现视图控制器(称为控制器 C),这是正确的吗?

标签: iphone ios objective-c uiviewcontroller modalviewcontroller


【解决方案1】:

没有公共 API 可以告诉您这一点。您可以听viewWillAppear: 并通过这种方式找出呈现的视图控制器正在被解除,但这很混乱。我会推荐我一直推荐并被认为是最佳实践的方法:永远不要关闭视图控制器!为你的展示视图控制器创建一个委托协议,将委托设置为展示视图控制器,当需要从展示中解除展示时,调用委托。


为什么不把正在展示的视图控制器放在一边,并在关闭后在块内访问它?

__weak id weakPresentingViewController = self.presentingViewController;

[self dismissViewControllerAnimated:YES completion: ^
{
    id strongPresentingViewController = weakPresentingViewController;

    if(strongPresentingViewController == nil) return;

    //Do what you will with the presenting view controller.
}

考虑到您当前的实现,这是最不容易出错的方法。如果呈现视图控制器在您的块被调用之前被释放,您将不会遇到错误的访问崩溃。在块内,你强烈地捕获它以确保它不会在你的代码中间释放。

【讨论】:

  • 你能说一下为什么推荐使用委托回调来进行解雇吗?
  • 因为呈现视图控制器知道如何正确关闭。例如,也许它使用了特殊的动画?当您尝试关闭时,您将无法重现动画。呈现视图控制器具有决定如何关闭的所有信息。
  • 感谢您的额外信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多