我有一个自定义容器 View Controller :ContainerVC
。它的工作是呈现两个内容 View Controller 之一:ContentPortraitVC
或 ContentLandscapeVC
,具体取决于当前方向(尽管容器选择其 View 的原因无关紧要,我假设)。 ContentPortraitVC
,在某些时候弹出ContentModalDetailVC
。
因此这里有两种不同的显示新内容的方法:
父子关系(通过
addChildViewController
发起并通过removeFromParentViewController
移除),呈现与被呈现的关系(通过
presentViewController
发起并通过dismissViewController
移除)。
如果 ContainerVC
添加了 ContentPortraitVC
,然后呈现 ContentModalDetailVC
,然后 ContainerVC
决定切换到 ContentLandscapeVC
,ContentModalDetailVC
保持可见(为什么当它的父级被移除时它没有被移除?)
但是,当 ContentPortraitVC
被要求删除 ContentModalDetailVC
时,没有任何反应。模态显示保持不变。这是怎么回事?
最佳答案
当您使用
addChildViewController
时添加ContentPortraitVC
:一个。
ContentPortraitVC
得到它的parentViewController
属性集。然后,您(根据 Apple 文档)必须手动显示
ContentPortraitVC
的看法。如果您遵循文档,您可以通过将其添加为ControllerVC
的 child 来执行此操作的顶级 View 。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 的父级)。现在,您从
ContentPortraitVC
转换至ContentLandscapeVC
.一个。 IOS 有点神奇。它知道你要删除的东西 (
ContentPortraitVC
) 有一个presentedViewController
当前处于事件状态,因此它会更改其父项。它将值设置为nil
在ContentPortraitVC
, 获取子项 (ContentModalDetailVC
) 并将其父项设置为新 View (ContentLandscapeVC
)。所以现在呈现模态视图的 View Controller 不再是它的呈现 View Controller 。就好像ContentLandscapeVC
第一时间呈现!在 View 方面,您按照 Apple 文档从
ContentPortraitVC
更改 View 。至ContentLandscapeVC
.但是您只是在更改ControllerVC
的 subview 的看法。在 iPhone 上,模态视图 Controller 仍然是唯一显示的内容,因此进行更改不会在屏幕上执行任何操作。在 iPad 上,它确实存在(尽管您可能看不到它,因为模态视图通常是全屏的)。现在您要关闭模态视图。大概您在
ContentPortraitVC
中执行此操作,但它不再与它所呈现的事物有任何关系。所以打电话[self dismissViewController...
什么都不做,因为ContentPortraitVC
不再展示任何东西,责任已转移给ContentLandscapeVC
.
这就是发生的事情及其原因。这是该怎么做。
当您从
ContentPortraitVC
更改时,您可以手动重新连接委托(delegate)至ContentLandscapeVC
,所以后者是试图关闭模态 Controller 的 Controller 。您可以使用
[self dismissModalControllerAnimated:YES completion:nil]
关闭模态 Controller 自身.如果这看起来很奇怪,我将提出并回答另一个问题,说明它为什么有效(IOS 如何知道要忽略哪个?)。您可以拥有
ControllerVC
弹出模态视图并负责将其删除。
关于ios - 模态视图 Controller 和 subview Controller 如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047124/