Swift - 相当于IBOutletCollection

Alc*_*zar 49 interface-builder iboutlet iboutletcollection swift

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

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

有没有人想出怎么做呢?

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

Nat*_*ook 81

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

@IBOutlet var labelCollection: [UILabel]!
Run Code Online (Sandbox Code Playgroud)

在我们等待修复时,您可以使用计算属性来估算它.假设我的观点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] }
Run Code Online (Sandbox Code Playgroud)

有点讨厌,但是从那时起我们可以将labels属性看作是一个IBOutletCollection,并且一旦修复了bug就不必更改我们代码的其余部分:

override func viewDidLoad() {
    super.viewDidLoad()

    for (index, item) in enumerate(self.labels) {
        item.text = "Label #\(index)"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 乍一看,这似乎有效,但事实并非如此.它确实比我的'UILabel []`尝试更好,因为我可以从IBOutlet拖动到一个特定的按钮,如果我尝试添加第二个按钮,它将取代第一个按钮.此外,如果我尝试运行它只连接一个按钮,swift将无法启动(命令/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift失败,退出代码254 ) (3认同)
  • 是啊.我认为这必定是IB/XCode中的一个错误.https://bugreport.apple.com (2认同)

小智 21

使用:

@IBOutlet var lineFields: [UITextField]!
Run Code Online (Sandbox Code Playgroud)

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


Zig*_*yST 13

@IBOutlet var buttons : [UIView]!
Run Code Online (Sandbox Code Playgroud)

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


apo*_*try 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
  }()
...
Run Code Online (Sandbox Code Playgroud)

基本上,它遍历所有子视图并检查一个是否是UIButton.在这种情况下,它会被添加到临时数组中.然后,此临时数组用于延迟实例化cardButtons数组.有关所有细节,请检查:Matchismo:Objective-C到Swift


Kru*_*nal 5

请按照以下步骤创建插座阵列并将其与IB Elements连接:

  • 创建一个IBOutlets数组
  • 在Storyboard ViewController界面中添加多个UIElement(视图)(如下快照所示)
  • 选择ViewController(在情节提要中)并打开连接检查器
  • 连接检查器中有“插座集合”选项(您将在此处看到一系列插座)
  • 如果与您的界面元素连接

--

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明