Swift将多个IBOutlet放入一个数组中

时间:2014-07-17 13:38:31

标签: ios swift cocoa iboutlet iboutletcollection

Multiple IBOutlets

我使用ctrl + drag

制作了这些(用红色边框标记)IBOutlets

但我不想要完全相同的9次线路(DRY)

如何将这些IBOutlet放入数组?

5 个答案:

答案 0 :(得分:38)

您可以在 Swift 中定义一个通用插座集合,如下所示:

@IBOutlet var collectionOfViews: Array<UIView>? // = [UIView]?

或者例如UIButton个对象:

@IBOutlet var collectionOfButtons: Array<UIButton>? // = [UIButton]?

您可以在文件所有者中的 Outlet Collections 组下找到您的馆藏:

Outlet Collections

连接5个随机按钮后,它会在我的控制台上显示:

Connected UIButton instances to Collection

答案 1 :(得分:19)

按照以下步骤创建一个出口阵列,并将其与IB Elements连接:

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

-

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


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

enter image description here

答案 2 :(得分:1)

这里的解决方案Swift - IBOutletCollection equivalent

@IBOutlet var objectCollection:[Object]

答案 3 :(得分:1)

这是针对 macOS(对于 iOS 应该类似),我在我的故事板中没有找到“Outlet Collections”(看起来他们取消了该选项)。所以我把我所有的按钮放在一个 NSStackView 中并从故事板链接堆栈

@IBOutlet weak var buttons: NSStackView!

然后我遍历它们以进行相应的更改

for case let (index, button as NSButton) in buttons.arrangedSubviews.enumerated() {
            if(index + 1 != someButtonIndex) {button.state = .off}
            else {button.state = .on}
        }

您也可以使用 tag 代替 index

答案 4 :(得分:0)

从两个视图窗格开始,您可以在其中看到代码和故事板。当您从UI到代码建立第一个IBOutlet连接时,只需仔细查看Connection下拉字段并选择名为“Outlet Collection”的选项。这将自动创建一个IBOutlets数组。接下来只需查看放置在创建数组的代码中的圆圈内的小黑圈。只需从此圆圈拖动到要连接到同一集合的所有其他UI对象(不确定是否可以混合类型)。类似地,您可以通过从创建的第一个黑点拖动到要连接到该操作的所有其他对象,将所有对象连接到一个Action。还要考虑使用EnumerateSequence()来帮助使用此Collection。很好吧?