iOS:如何以编程方式将视图添加到情节提要视图

Posted

技术标签:

【中文标题】iOS:如何以编程方式将视图添加到情节提要视图【英文标题】:iOS: How to programmatically add a view to a storyboard view 【发布时间】:2015-09-05 07:06:26 【问题描述】:

场景:我正在为 ios 开发一个混合 Cordova (Phonegap) 应用程序。为了混合原生代码和 Cordova 代码,我在 Xcode 7 中设置了一个故事板,其中 UIView 嵌入到容器视图中(使用 embed segue),以便能够在整个原生应用程序中重用 Web 视图。

对于 Cordova 视图的嵌入,我找到了以下说明: http://cordova.apache.org/docs/en/edge/guide_platforms_ios_webview.md.html#iOS%20WebViews

这基本上是说你必须这样称呼:

CDVViewController* viewController = [CDVViewController new];
viewController.view.frame = CGRectMake(0, 0, 320, 480);
[myView addSubview:viewController.view];

但他们没有解释如何将视图添加到情节提要视图。我特别问自己如何处理 CGRectMake 事情,因为我希望视图响应式地呈现,即调整自身以适应父视图的约束(而不是具有固定的矩形)。

我已经通过派生自 Cordova 的标准应用程序委托来实现这一点,但这一定是错误的做法。当我调用 Cordova 的相机,拍照并返回我的 web 视图时,web 视图突然跳出它的边界(到窗口的顶部),并且我在 Xcode 控制台中看到以下错误消息:

Presenting view controllers on detached view controllers is discouraged

PS:我实际上使用的是 Swift,但我能够阅读 Objective-C 代码,因此任何这些语言的代码示例都适合我。

【问题讨论】:

【参考方案1】:

只需为情节提要中存在的视图创建一个出口,连接它并添加子视图

@IBOutlet weak var containerView: UIView!

func addMySubview() 
 var viewController = CDVViewController()
 viewController.view.frame = containerView.frame
 containerView.addSubview(viewController.view)

编辑: 在这里,我在操场上做了一个例子,这样你就可以看到你的视图框架如何随着父母的变化而变化。

【讨论】:

感谢您快速回答。是的,到目前为止,这部分很清楚。但是如何安装正确的框架?我不想有一个固定的 CGRect 大小。 很抱歉使用 swift,但我想你明白了。 顺便说一句:我还在某处读到,在将子视图添加到其父视图后,您必须在子视图上调用 didMoveToParentViewController,但这并未包含在 Cordova 的文档中。这会导致问题吗? 如果在添加或删除子视图后需要执行某些操作,则覆盖 didMoveToParentViewController。来自苹果的文档:“当您的视图控制器想要对添加到容器中做出反应时,它可以覆盖此方法。”

以上是关于iOS:如何以编程方式将视图添加到情节提要视图的主要内容,如果未能解决你的问题,请参考以下文章

对于 iOS,我可以混合和匹配以编程方式添加视图并同时使用情节提要吗?

以编程方式将视图添加到情节提要

无法以编程方式将视图添加到情节提要中的现有子视图

从情节提要重新加载视图时,以编程方式添加的 iOS 子视图会丢失

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

以编程方式添加的视图对象未显示在情节提要中