好的,我想你要问的是你有一个 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”的堆栈溢出,你会发现很多结果。如果您有更多问题,当然可以回复!