为什么不能将IBInspectable与枚举一起使用?
我记得当我在2014年看到WWDC的IBInspectable和IBDesignable时 ,我的反应是:
太神奇了,现在我可以创建一个组件并在Interface Builder中查看结果并配置它,这是设计人员可以使用的一个很棒的功能。 完善! 不。
要了解IBDesignable和IBInspectable ,请参阅我的另一篇文章– 什么是IBDesignable / IBInspectable? [1]。
尝试与IBInspectable一起使用枚举
如果尝试创建像下面的代码这样的枚举并将其与IBInspectable属性一起使用,您将看到它不起作用。
枚举DateFormat:Int {
案例短// 05/20/2016
案例Medium // 2016年5月20日
案例全// // May 20,2016 11:10 AM
}
@IBDesignable
类CustomLabel:UILabel {
@IBInspectable
var format:DateFormat = .Short {
didSet {
//更新标签
}
}
}
IBInspectable对类型有一些限制:
Int,CGFloat,Double,String,Bool,CGPoint,CGSize,CGRect,UIColor和UIImage 。
我认为IBInspectable不支持枚举,因为正如Swift编程语言所说:
“使用枚举创建枚举。像类和所有其他命名类型一样,枚举可以具有与之关联的方法。” [2]
因此,枚举不仅是一个简单的枚举,而且可以为(例如)创建更多的枚举:
公共枚举DateFormat:Int {
案例短// 05/20/2016
案例Medium // 2016年5月20日
案例全// // May 20,2016 11:10 AM
公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
}
我的解决方案将IBInspectable与枚举一起使用
不幸的是,要解决此问题,我需要更改代码,并使用布尔值:
公共枚举DateFormat:Int {
案例短// 05/20/2016
案例全// // May 20,2016 11:10 AM
公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
}
@IBDesignable
公共类CustomLabel:UILabel {
var _format:DateFormat = DateFormat()
@IBInspectable
var fullFormat:Bool = false {
didSet {
如果self.fullFormat {
self._format = DateFormat.Full
}其他{
self._format = DateFormat.Short
}
self.setNeedsDisplay()
}
}
}
好! 使用此解决方案,我只有两种情况,没有更多的Medium 情况 ,我删除了它,因为这对用户体验来说不是问题。 我认为这比将fullFormat与其他类型(如Int或String)更好……为什么?
另一个解决方案
如果在代码中添加了一个Int类型的IBInspectable属性,那么Interface Builder的用户需要知道枚举的范围值,并且当fullFormat值超出范围时(例如),您需要设置_format值:
公共枚举DateFormat:Int {
案例短// 05/20/2016
案例全// // May 20,2016 11:10 AM
公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
public init(value:Int){
var结果:DateFormat = DateFormat()
切换值{
大小写DateFormat.Short.rawValue:
结果= DateFormat.Short
大小写DateFormat.Full.rawValue:
结果= DateFormat.Full
默认:
结果= DateFormat.Full
}
自我=结果
}
}
@IBDesignable
公共类CustomLabel:UILabel {
var _format:DateFormat = DateFormat()
@IBInspectable
var fullFormat:Int = DateFormat.Short.rawValue {
didSet {
self._format = DateFormat(值:self.fullFormat)
self.text =“ \(self._format.rawValue)”
setNeedsDisplay()
}
}
}
结果:
整数大小写类似于String或其他类型…
参考文献
[1] https://medium.com/@GeraldoBastos/whats-ibdesignable-ibinspectable-292829384e1#.h9x51kh63
[2] Apple Inc.“快速编程语言”。iBooks。 https://itun.es/br/jEUH0.l