在 Xcode/Swift 中使用预设置视图

Posted

技术标签:

【中文标题】在 Xcode/Swift 中使用预设置视图【英文标题】:Working with pre-setup views in Xcode/Swift 【发布时间】:2016-03-01 18:33:21 【问题描述】:

假设,我在 Xcode 的 Storyboard 中以某种方式设置了一个视图。我还编写了一个 UIView 子类——“CustomView”供该视图使用。此 CustomView 具有与情节提要中的 UIView 所包含的元素相对应的属性。

首先,我能否以某种方式将 CustomView 子类的属性连接到 Storyboard 中视图的 UI 元素(视图具有标签、图像等)?

我知道我可以创建 IBOutlets。但是我认为将所有视图的元素连接到一个 VC 上效率不会那么高,因为我在 UIStackView 中堆叠了相同的 CustomView(总体而言,UIStackView 中有三个 CustomView)。

如果不是,那么以编程方式设置此类元素的最有效方法是什么(我想通过 API 设置属性的值,所以每个 CustomView 看起来都一样,但它的元素会有不同的值)。我不想完全通过代码创建我在故事板中设置的视图,因为添加约束和布置子视图将是一个巨大的痛苦(尽管我知道可以这样做)。

【问题讨论】:

【参考方案1】:

好的,我想你要问的是你有一个 uiview,里面有一个 stackview,MyCustomUIView。您希望在同一个视图控制器 MyViewController 上重复使用该视图 3 次,并且每次都将不同的数据加载到其中。对吗?

如果这是您想要的设置,那么您将所有出口设置为 MyCustomUIView。在 MyViewController 上,您为您的三个视图(view1、view2、view3)创建三个出口,并且您将以编程方式将 MyCustomView 加载到每个视图(view1、view2、view3)中,然后以 view1.label 的形式从这些视图访问标签和其他出口, view2.label 等。如果您使用 xibs 而不是故事板顺便说一句,这将更容易/更清洁。我个人会这样做,但如果您的项目是基于故事板的,您可以将 MyViewController 保留在故事板上并为 MyCustomUIView 创建一个 xib,然后按照我上面的描述加载它。

您可以在情节提要中进行设置的另一种方法是在 MyViewController 上使用带有 3 个单元格的 UITableView,而不是您的三个 UIView。通常,出于多种原因,这将是重用视图的首选方式。一个原因是,如果您想要 4 个视图,或者只有 2 个视图,那么更改起来非常简单。您不必更改 MyViewController 上的所有 UI/约束。

为了解决您对程序约束的担忧……是的,它们很痛苦。然而,Apple 添加了可用于简化编程布局约束的锚点: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UILayoutGuide_Class_Reference/index.html#//apple_ref/doc/uid/TP40015257-CH1-DontLinkElementID_13

或者您可以使用 PureLayout cocoapod 进一步简化事情: https://github.com/PureLayout/PureLayout

附加信息

如果使用 xib 并以编程方式添加它,您将执行以下操作:

创建一个 Cocoatouch 类文件

在下一个屏幕上将其设为 UIViewController 并勾选“同时创建一个 XIB 文件”。

然后在 MyViewController 中:

view1 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view1.someLabel.text = "set the text"

view2 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view2.someLabel.text = "set the text"

view3 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view3.someLabel.text = "set the text"

除了您在评论中提到的使用 tableview 或 collectionview 之外,我实际上不知道如何在没有 xib 的情况下在情节提要中拥有可重用的视图(或者如果可能的话)。也许如果有可能其他人会回复:)

现在您已经掌握了这些基本信息,如果您仍然感到困惑,请在谷歌上搜索有关 xibs 的信息。搜索“add xib swift”的堆栈溢出,你会发现很多结果。如果您有更多问题,当然可以回复!

【讨论】:

感谢您的回复。你正确地理解了我。 “以编程方式将 MyCustomView 加载到每个视图中”是什么意思?老实说,我从来没有使用过xibs。也许我需要对该主题进行一些研究:) 我仍然不明白是否有任何方法可以将 MyCustomView 中的属性连接到(可重用的)Storyboard 视图。还是只能用xibs完成?是的,我虽然想使用 TableView,但我不知道它是否可以水平滚动:) 也许 UICollectionView 在我的情况下会更好。 在故事板中,它们无论如何都是“以编程方式”加载的。有一种机制可以在幕后完成所有工作。现在使用(在 SB 中出现了)所以你需要处理它。我用情节提要的术语来说,NavigatoinController 是你视图所在的“某种枢轴点”。但是继承有点简单......如果你需要帮助,请大声告诉我...... 我编辑了我的答案以包含有关如何添加 xib 的信息

以上是关于在 Xcode/Swift 中使用预设置视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节提要 XCode6 (Swift) 中将所有视图控制器设置为风景

Xcode(Swift):我无法在视图控制器之间传输数据

XCODE/Swift Autolayout ScrollView with dynamic label, textview etc. 如何根据 textview 设置滚动视图高度

视图控制器上的 Xcode / Swift 后退按钮

使视图的高度随图像 Xcode swift 的高度动态变化

在一个视图控制器中使用不同的按钮上传多个图像(iOS、Xcode 9、Swift 4)