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

Working with pre-setup views in Xcode/Swift

假设,我在 Xcode 的故事板中以某种方式设置了一个视图。我还编写了一个 UIView 子类 – "CustomView" 供该视图使用。此 CustomView 的属性对应于故事板中 UIView 所包含的元素。

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

我知道我可以创建 IBOutlets。但我认为将所有视图的元素连接到一个 VC 效率不高,因为我在 UIStackView 中堆叠了相同的 CustomView(总的来说,UI 中有三个 CustomView StackView).

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

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

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

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

为了解决您对编程限制的担忧...是的,它们很痛苦。然而,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 class 文件

在下一个屏幕上将其设为 UIViewController 并勾选 "Also create a XIB file"。

然后在 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" 的堆栈溢出,您会发现很多结果。如果您有更多问题,当然可以回复!