Xcode 用于批量en\disable的快速混合类型UIControl数组
我正在尝试禁用大量不同的控件。如果数组是[Slider1、Slider2、Slider3]或任何其他匹配uicontrol集,则此操作正常Xcode 用于批量en\disable的快速混合类型UIControl数组,xcode,swift,Xcode,Swift,我正在尝试禁用大量不同的控件。如果数组是[Slider1、Slider2、Slider3]或任何其他匹配uicontrol集,则此操作正常 let C = [Slider, Button, Label] for control in C, { control.enabled = B } 返回错误“UIView类型的值没有“已启用”成员。” 我假设当我混合uicontrol类型时,它将数组类型为UIView 有没有办法使这项工作或其他类似的有效方法?问题在于标签。虽然ui标签有一个名为
let C = [Slider, Button, Label]
for control in C, {
control.enabled = B
}
返回错误“UIView类型的值没有“已启用”成员。”
我假设当我混合uicontrol类型时,它将数组类型为UIView
有没有办法使这项工作或其他类似的有效方法?问题在于
标签。虽然ui标签
有一个名为已启用的成员
,但它与ui标签
和ui按钮
的成员不同
正如您正确提到的,后面的代码继承自提供启用的成员
但是,ui标签
没有。它只是(巧合地)定义了一个名为enabled
的成员。然而,编译器并不真正关心成员的命名。他寻找第一个常见的超类,它是UIView
,它没有名为enabled的成员,就是这样
因此,您的解决方案是仅在数组中组合实际的UIControls
。这些文件列出了以下内容:
- UIButton
- 数据采集器
- UIPageControl
- 刷新控制
- UISegmentedControl
- 乌斯利德
- 乌斯泰珀
- 开关
- UITextField
标签上的循环必须在不同的/秒循环中完成。您可以使UILabel
和UIControl
符合公共协议:
protocol HasEnabled : class {
var enabled: Bool { get set }
}
extension UILabel : HasEnabled { }
extension UIControl : HasEnabled { }
然后,您可以声明hasaEnabled
类型的数组:
let controls : [ HasEnabled ] = [ label, slider, button ]
for control in controls {
control.enabled = true
}
或者声明一个UIView
数组,但只在元素上迭代
符合已启用的:
let controls : [UIView] = [ label, slider, button ]
for case let control as HasEnabled in controls {
control.enabled = true
}
在第一种情况下,编译器确保只有
符合的已启用的
将添加到数组中
在第二种情况下,可以将任意UIView
对象添加到
数组,但循环体仅对符合条件的数组执行
至已启用