在我的应用程序中,我有这个视图控制器,用户输入信息来创建一个对象。在这个视图的顶部,我有一个标签栏,在底部我有一个按钮,用户点击该按钮来创建/保存对象。在这两个视图之间,我有一些元素,如文本字段,标签,以及用户输入对象信息的一些其他内容(基本上是对象的一种形式)。
我现在正在尝试支持横向模式以及向此视图控制器添加更多表单。问题出在较小的设备和横向上,所有表单元素和文本字段等都不适合。
我正在尝试使用滚动视图来解决此问题。我使用this Stack Overflow answer来使滚动视图在测试项目中工作(在将概念移植到我的实际项目之前)。
如果我无法使用该方法将按钮固定到屏幕底部,则只会出现问题。为了解决这个问题,我在主视图控制器(视图控制器A)中创建了一个容器视图。该容器视图映射到容纳滚动视图和内容的视图控制器(视图控制器B)。然后在视图控制器A的容器视图正下方,我可以添加创建/保存按钮。从设计的角度来看,这似乎完美无缺。但是现在内容在创建/保存按钮的单独视图控制器中,我无法实际获取用户输入文本字段的内容和输入。
处理这种情况的最佳方法是什么?使用容器视图真的是最好的方法吗?有没有一种简单的方法可以将文本字段中的输入映射回主视图控制器?
如果可能的话,我希望尽可能多地保留Storyboard中的设计工作。在Swift中添加视图和设计元素将是最后的选择。但我很确定我需要使用某种类型的代码将数据恢复到主视图控制器,这完全可以。
答案 0 :(得分:1)
您实现所需行为的最简单方法如下:
1)指定在IB中为您创建的嵌入segue的自定义标识符。例如," embedViewControllerB"
2)在视图控制器A中添加以下参数:
weak var viewControllerB: ViewControllerB?
3)在视图中,控制器A覆盖prepare(for segue:)
功能。检查segue是否是嵌入的,如果是,则存储对B控制器的引用:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "embedViewControllerB" {
self.viewControllerB = segue.destination as! ViewControllerB
}
}
现在,当您点击按钮时,您可以通过viewControllerB?
属性访问视图控制器B的内容。
在此阶段,由您决定如何继续。你可以将IBOutlets设置为B中的文本视图并在A中读取它们的内容,或者你可以在B中实现一些能够返回必要数据的函数(可能在元组中?)。
希望这有帮助