Swift将多个IBOutlets放入数组中

37

多个IBOutlets

使用ctrl + drag,我创建了这些(用红色边框标记的)IBOutlets。

但是我不想重复第9行9次(DRY)。

如何将这些IBOutlets放入数组中?

5个回答

47

你可以像这样在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
我如何将Storyboard中的按钮连接到这个数组? - cor
@CorPruijs,您可以在“出口集合”组下找到您的收藏。您可以像处理单个出口一样将多个项目连接到该收藏中。 - holex
@CorPruijs,那是你的代码吗,@IBOutlet var levelField: Array<UIButton> = Array<UIButton>...?你不需要操作数的正确大小,请将等号符号后面的所有内容都删除,包括等号本身;请看我的答案,我没有给它分配任何值,因为这是不必要的。 - holex
从Swift 2(Xcode 7.1)开始,上述代码不再适用。我添加了IBOutlet数组,并将该数组连接到Interface Builder中的按钮。但是当我尝试编译时,会出现编译器错误“Class 'ViewController'没有初始化程序”。建议的解决方法是初始化数组:@IBOutlet var buttonArray: [UIButton] = [] - Jay Imerman
集合(也称为Array<UIView>)必须通过强引用保持活动状态,在这里没有weak修饰符。 - holex
显示剩余11条评论

34

按照以下步骤创建一个出口数组并将其与IB元素连接:

  • 创建一个IBOutlet数组
  • 在Storyboard ViewController界面中添加多个UIElements(Views)
  • 选择ViewController(在storyboard中)并打开连接检查器
  • 连接检查器中有“Outlet Collections”选项(您将在那里看到一个出口数组)
  • 将其连接到您的界面元素

-

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


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

在此输入图片描述


2

4
这个回答太简短,没有提供细节,应当删除。 - Jay Imerman
或者,也许作者可以扩展他们的答案。 - ICL1901
3
好的,我会尽力以简洁明了的方式进行翻译。请告诉我需要翻译的内容。 - SomaMan

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接