Swift - 相当于IBOutletCollection

时间:2014-06-05 05:43:18

标签: swift interface-builder iboutlet iboutletcollection

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

在第3讲的第77页slides,它显示使用IBOutletCollection,这不是Swift的选项。 Swift doc示例显示了一个包含IBOutlet数组的示例,但我无法弄清楚如何使Interface Builder将多个出口连接到同一个IBOutlet / IBOutlet数组。 / p>

有没有人想出怎么做呢?

我知道我可以创建12个插座并以这种方式处理它,但我想尽可能地使这个工作尽可能地与演讲幻灯片中的例子一起工作。

7 个答案:

答案 0 :(得分:80)

更新:现在可以在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)"
    }
}

答案 1 :(得分:19)

使用:

@IBOutlet var lineFields: [UITextField]!

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

答案 2 :(得分:13)

\x0d

然后从界面构建器中的连接检查器或您通常用于该

的任何方法中拖动它

答案 3 :(得分:9)

修改

  

这已经在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 to Swift

答案 4 :(得分:4)

按照步骤创建出口阵列并将其与IB Elements连接:

  • 创建一个IBOutlets数组
  • 在Storyboard ViewController界面中添加多个UIElements(视图)(如下面的快照所示)
  • 选择ViewController(在故事板中)并打开连接检查器
  • 有选项' Outlet Collections'在连接检查器中(你会在那里看到一系列的插座)
  • 使用界面元素连接

-

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


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

enter image description here

答案 5 :(得分:2)

我使用这种语法

在Xcode种子3中使用了它
@IBOutlet strong var views: NSArray?

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

答案 6 :(得分:1)

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