ios - 模态视图 Controller 和 subview Controller 如何交互?

标签 ios uiviewcontroller modal-dialog

我有一个自定义容器 View Controller :ContainerVC。它的工作是呈现两个内容 View Controller 之一:ContentPortraitVCContentLandscapeVC,具体取决于当前方向(尽管容器选择其 View 的原因无关紧要,我假设)。 ContentPortraitVC,在某些时候弹出ContentModalDetailVC

因此这里有两种不同的显示新内容的方法:

  • 父子关系(通过 addChildViewController 发起并通过 removeFromParentViewController 移除),

  • 呈现与被呈现的关系(通过 presentViewController 发起并通过 dismissViewController 移除)。

如果 ContainerVC 添加了 ContentPortraitVC,然后呈现 ContentModalDetailVC,然后 ContainerVC 决定切换到 ContentLandscapeVCContentModalDetailVC 保持可见(为什么当它的父级被移除时它没有被移除?)

但是,当 ContentPortraitVC 被要求删除 ContentModalDetailVC 时,没有任何反应。模态显示保持不变。这是怎么回事?

最佳答案

  1. 当您使用 addChildViewController 时添加 ContentPortraitVC :

    一个。 ContentPortraitVC得到它的 parentViewController属性集。

    然后,您(根据 Apple 文档)必须手动显示 ContentPortraitVC的看法。如果您遵循文档,您可以通过将其添加为 ControllerVCchild 来执行此操作的顶级 View 。

  2. ContentPortraitVC然后调用 presentViewController显示 ContentModalDetailVC .

    一个。这设置了它的 presentingViewController属性(在调试器中显示为 _parentModalViewController ivar——注意 ivar 与属性不同),并设置 presentedModalViewController ContentPortraitVC 的属性(property)(谁的 ivar 是 _childModalViewcontroller )。

    在 iPhone 上的 View 明智,ContentModalDetailVC的 View 将完全替换来自 ContentPortraitVC 的 View 和 ContainerVC ,所以只有模态视图 Controller 的 View 是可见的。 (在 iPad 上,它将新 UI 层叠在顶部,但作为 ControllerVC View 的兄弟,而后者又是 ContentPortraitVC View 的父级)。

  3. 现在,您从 ContentPortraitVC 转换至 ContentLandscapeVC .

    一个。 IOS 有点神奇。它知道你要删除的东西 ( ContentPortraitVC ) 有一个 presentedViewController当前处于事件状态,因此它会更改其父项。它将值设置为 nilContentPortraitVC , 获取子项 (ContentModalDetailVC) 并将其父项设置为新 View (ContentLandscapeVC)。所以现在呈现模态视图的 View Controller 不再是它的呈现 View Controller 。就好像ContentLandscapeVC第一时间呈现!

    在 View 方面,您按照 Apple 文档从 ContentPortraitVC 更改 View 。至 ContentLandscapeVC .但是您只是在更改 ControllerVC 的 subview 的看法。在 iPhone 上,模态视图 Controller 仍然是唯一显示的内容,因此进行更改不会在屏幕上执行任何操作。在 iPad 上,它确实存在(尽管您可能看不到它,因为模态视图通常是全屏的)。

  4. 现在您要关闭模态视图。大概您在 ContentPortraitVC 中执行此操作,但它不再与它所呈现的事物有任何关系。所以打电话[self dismissViewController...什么都不做,因为 ContentPortraitVC不再展示任何东西,责任已转移给ContentLandscapeVC .

这就是发生的事情及其原因。这是该怎么做。

  1. 当您从 ContentPortraitVC 更改时,您可以手动重新连接委托(delegate)至 ContentLandscapeVC ,所以后者是试图关闭模态 Controller 的 Controller 。

  2. 您可以使用 [self dismissModalControllerAnimated:YES completion:nil] 关闭模态 Controller 自身.如果这看起来很奇怪,我将提出并回答另一个问题,说明它为什么有效(IOS 如何知道要忽略哪个?)。

  3. 您可以拥有 ControllerVC弹出模态视图并负责将其删除。

关于ios - 模态视图 Controller 和 subview Controller 如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047124/

相关文章:

ios - Segue 在 DidSelectAtRow 函数之前执行

ios - 1 个屏幕包含 2 个 View Controller 的最佳方法

ios - Objective-C instantiateViewControllerWithIdentifier 返回 nil

javascript - 演示 : how to import this micromodal library

javascript - 在 Vue.js 中允许多个模式

javascript - 谷歌地图标记点击,显示模态

ios - 有谁知道 Parse.com 文档发生了什么事?

ios - 为什么我的 mapview 框架的中心不与其中心坐标对齐?

iOS9 ActivityManager.startActivityUpdatesToQueue 错误

ios - 如何使用 IPv6 设置 Restund Turn 服务器