使用ctrl + drag
,我创建了这些(用红色边框标记的)IBOutlets。
但是我不想重复第9行9次(DRY)。
如何将这些IBOutlets放入数组中?
使用ctrl + drag
,我创建了这些(用红色边框标记的)IBOutlets。
但是我不想重复第9行9次(DRY)。
如何将这些IBOutlets放入数组中?
你可以像这样在Swift中定义一个通用的出口集合:
@IBOutlet var collectionOfViews: Array<UIView>? // = [UIView]?
例如,对于 UIButton
对象:
@IBOutlet var collectionOfButtons: Array<UIButton>? // = [UIButton]?
通常情况下,您可以在文件所有者中找到您的收藏,这些收藏位于Outlet Collections组中:
如果连接了5个随机按钮,控制台上会显示如下内容:
按照以下步骤创建一个出口数组并将其与IB元素连接:
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
解决方案在这里:Swift - IBOutletCollection 相当于什么?
@IBOutlet var objectCollection: [Object]
注:此处的 Object 是指某个类或结构体。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
。从两个视图窗格开始,您可以同时看到代码和故事板。当您第一次从 UI 到代码建立 IBOutlet 连接时,请仔细查看连接下拉字段,并选择称为“Outlet Collection”的选项。这将自动创建一个 IBOutlet 数组。接下来,只需在代码中创建数组的位置寻找一个带有小黑色圆圈的圆圈。然后,只需从该圆圈拖动到您要连接到同一集合的所有其他 UI 对象(不确定是否可以混合类型)。同样,您可以通过从第一个创建的黑点拖动到所有要连接到该操作的其他对象来将所有对象连接到一个操作。此外,还考虑使用 EnumerateSequence() 来帮助处理此 Collection。很棒对吧?
@IBOutlet var levelField: Array<UIButton> = Array<UIButton>
...?你不需要操作数的正确大小,请将等号符号后面的所有内容都删除,包括等号本身;请看我的答案,我没有给它分配任何值,因为这是不必要的。 - holexIBOutlet
数组,并将该数组连接到Interface Builder中的按钮。但是当我尝试编译时,会出现编译器错误“Class 'ViewController'没有初始化程序”。建议的解决方法是初始化数组:@IBOutlet var buttonArray: [UIButton] = []
。 - Jay ImermanArray<UIView>
)必须通过强引用保持活动状态,在这里没有weak
修饰符。 - holex