Swift – IBOutletCollection等效

我试图在Swift中的iTunesU中复制斯坦福大学Matchismo游戏“为iphone和ipad开发ios7应用程序”。

在第三讲幻灯片的第77页上,它显示了使用IBOutletCollection ,它不是Swift上的一个选项。 Swift doc示例显示了一个具有IBOutlet数组的示例,但是我无法弄清楚如何使Interface Builder将多个出口连接到同一个IBOutlet / IBOutlet数组。

有没有人想出了如何做到这一点呢?

我知道我可以创build12个销售点并以这种方式来处理,但是我想尽可能地将这个工作与演讲幻灯片中的例子进行比较。

编辑

这在Swift的一个更新版本的Beta版本中得到修复 – 现在在界面构build器的IBCollection选项中。


对于Swift早期的Beta版本:

我遇到了同样的问题:在Beta 2发行说明中,您会看到以下声明:

Interface Builder不支持在Swift类中声明出口集合

我通过以下方式解决了这个问题(易于定制):

 class CardGameViewController: UIViewController { @lazy var cardButtons : UIButton[] = { var tempBtn: UIButton[] = [] for v:AnyObject in self.view.subviews { if v is UIButton { tempBtn.append(v as UIButton) } } return tempBtn }() ... 

基本上,它遍历所有子视图,并检查是否是UIButton。 在这种情况下,它被添加到临时数组中。 这个临时数组然后被用来懒惰的实例化cardButtons数组。 对于所有的细节,请检查: Matchismo:Objective-C到Swift

更新:现在在Xcode中正常工作 – “Outlet Collection”是Interface Builder中的一个连接选项,它创build如下所示的内容:

 @IBOutlet var labelCollection: [UILabel]! 

在等待修复时,可以使用计算属性对此进行近似。 假设我的观点有五个我想要的UILabels集合。 我仍然必须申报每一个,但是我也宣布一个计算的财产收集他们:

 class MyViewController { @IBOutlet var label1 : UILabel @IBOutlet var label2 : UILabel @IBOutlet var label3 : UILabel @IBOutlet var label4 : UILabel @IBOutlet var label5 : UILabel var labels: UILabel![] { return [label1, label2, label3, label4, label5] } 

这种烦人的,但从那时起,我们可以把labels属性看作是一个IBOutletCollection ,而且一旦错误得到修复,就不必修改剩下的代码:

 override func viewDidLoad() { super.viewDidLoad() for (index, item) in enumerate(self.labels) { item.text = "Label #\(index)" } } 

使用:

 @IBOutlet var lineFileds : [UITextField]! 

然后按照顺序从TextField元素拖放到lineFileds

 @IBOutlet var buttons : [UIView]! 

然后从界面构build器中的连接检查器中拖动它,或者通常使用的任何方法

我使用这种语法在Xcode种子3中得到了这个工作

 @IBOutlet strong var views: NSArray? 

请参阅我的讨论: https : //stackoverflow.com/a/24686602/341994

@machine说什么似乎是iOS 9绑定的当前状态(XCode 7.1)。 关键是把它们全部拖拽。 使用第一项来控制+拖动到控制器代码,然后将出口types更改为集合。 从控制器代码文件中,将出口点依次拖拽到每个屏幕控件上(如@machine所示)

按照步骤创build一个socketsarrays并将其与IB元件连接起来:

  • 创build一个IBOutlets数组
  • 在Storyboard ViewController界面中添加多个UIElements(Views)(如下图所示)
  • selectViewController(在故事板)并打开连接检查器
  • 在连接检查员有选项“出口收集”(你会看到一系列的网点)
  • 连接,如果你的界面元素

 class ViewController2: UIViewController { @IBOutlet var collection:[UIView]! override func viewDidLoad() { super.viewDidLoad() } } 

在这里输入图像说明