iOS Storyboard 滚动视图,内容围绕视图

Posted

技术标签:

【中文标题】iOS Storyboard 滚动视图,内容围绕视图【英文标题】:iOS Storyboard Scroll View With Content Around View 【发布时间】:2017-10-05 03:15:21 【问题描述】:

在我的应用程序中,我有这个视图控制器,用户可以在其中输入信息来创建一个对象。在这个视图的顶部我有一个标签栏,在底部我有一个按钮,用户点击它来创建/保存对象。在这两个视图之间,我有一些元素,例如文本字段、标签和其他一些用户输入对象信息的元素(基本上是对象的表单)。

我现在正在尝试支持横向模式以及向此视图控制器添加更多表单。问题在于较小的设备和横向所有表单元素和文本字段等都不适合。

我正在尝试使用滚动视图来解决这个问题。我使用this Stack Overflow answer 让滚动视图在测试项目中工作(在我将概念移植到我的实际项目之前)。

唯一的问题是如果我无法使用该方法将按钮固定到屏幕底部。为了解决这个问题,我在主视图控制器(视图控制器 A)内创建了一个容器视图。该容器视图映射到包含滚动视图和内容的视图控制器(视图控制器 B)。然后在视图控制器 A 中容器视图的正下方,我能够添加创建/保存按钮。从设计的角度来看,这似乎完美无缺。但是现在内容与创建/保存按钮位于单独的视图控制器中,我实际上无法从用户输入文本字段的内容中获取内容和输入。

处理这种情况的最佳方法是什么?在这里使用容器视图真的是最好的方法吗?有没有一种简单的方法可以将这些输入从文本字段映射回主视图控制器?

如果可能的话,我希望将尽可能多的设计工作保留在 Storyboard 中。在 Swift 中添加视图和设计元素将是最后的手段。但我很确定我需要使用某种类型的代码将数据返回到主视图控制器,这完全没问题。

【问题讨论】:

据我了解,B 是 A 的子视图控制器?如果这是正确的,你能告诉我你是否在你的代码中添加它作为一个孩子吗? @AndriyGordiychuk 我有我正常的默认视图控制器(视图控制器 A)。然后我将容器视图拖到该默认视图控制器上。它在视图控制器 A 内创建了一个视图,并创建了一个新的视图控制器(视图控制器 B)。这一切都是在情节提要中完成的,根本没有代码。在视图控制器 B 内部,我有滚动视图和内容以及所有这些。在视图控制器 A 中,我只有容器视图(通过一些嵌入 segue 或类似的东西链接到视图控制器 B)和底部的创建/保存按钮。 @AndriyGordiychuk 如果这没有意义,请告诉我。 有道理会告诉你如何解决你的问题 【参考方案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 中实现一些函数来返回必要的数据(可能在元组中?)。

希望对你有帮助

【讨论】:

很抱歉这么久才回复。我想花了更长的时间来实施。因此,我不得不将其重命名为 segue.destination 而不是 segue.destinationController,以便未来的观众知道(在 Swift 3 中)。尝试访问视图控制器 A:Value of type 'UIViewController?' has no member 'textField' 中的变量时,我也遇到了错误。有什么想法吗? 你需要有 '@IBAction var textField:UITextField!'访问它。否则,显然,您无法访问它:) 我在视图控制器 B 中有 @IBOutlet var textField: UITextField! 在视图控制器 A 中,给出该错误的行是 self.viewControllerB.textField.text! 确保指向视图控制器 B 的变量被声明为具有视图控制器 B 的类。否则,如果它被声明为 UIViewController,您将无法访问插座

以上是关于iOS Storyboard 滚动视图,内容围绕视图的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中自动调整 UITextView 的大小

在IOS的Storyboard中隐藏子视图

如何使 UITableView 内容围绕中心点滚动

iOS Storyboard 约束未按预期运行

滚动视图和导航栏 ios9

在 StoryBoard iOS 中将 UIContainerveiw 添加到 SlideViewNavigation 的问题