56

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

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

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

我知道我可以创建 12 个插座并以这种方式处理它,但我想让这项工作尽可能接近讲座幻灯片中的示例。

4

7 回答 7

87

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

@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)"
    }
}
于 2014-06-05T17:34:31.707 回答
24

采用:

@IBOutlet var lineFields: [UITextField]!

lineFields然后按顺序从 UITextField 元素拖动到控件。

于 2015-04-22T07:15:27.830 回答
16
@IBOutlet var buttons : [UIView]!

然后将其从界面构建器中的连接检查器或您通常使用的任何方法中拖动

于 2015-06-19T13:16:11.407 回答
10

编辑

这在 Swift 的后续 Beta 版本中得到了修复 - 现在在界面构建器中的 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

于 2014-06-20T13:28:41.213 回答
8

按照步骤创建一个插座阵列并将其与 IB Elements 连接:

  • 创建一个 IBOutlets 数组
  • 在 Storyboard ViewController 界面中添加多个 UIElement(视图)(如下图所示)
  • 选择 ViewController(在故事板中)并打开连接检查器
  • 连接检查器中有“Outlet Collections”选项(您将在那里看到一系列插座)
  • 与您的界面元素连接

-

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

在此处输入图像描述

于 2017-10-24T12:10:52.310 回答
2

我使用这种语法在 Xcode 种子 3 中工作

@IBOutlet strong var views: NSArray?

在这里查看我的讨论:https ://stackoverflow.com/a/24686602/341994

于 2014-07-10T21:29:42.393 回答
1

@machine 所说的似乎是 iOS 9 绑定的当前状态(XCode 7.1)。关键是按顺序拖动它们。使用第一项控制+拖动到控制器代码中,然后将 Outlet 类型更改为集合。从控制器代码文件中将出口点按顺序一一拖到每个屏幕控件上(如@machine所说)

于 2015-10-30T18:04:06.443 回答