如何创build一个枚举types的IBInspectable
enum
不是 Interface Builder定义的运行时属性。 以下不在接口生成器的属性检查器中显示:
enum StatusShape:Int { case Rectangle = 0 case Triangle = 1 case Circle = 2 } @IBInspectable var shape:StatusShape = .Rectangle
从文档: 您可以将IBInspectable属性附加到类接口生成器定义的运行时属性所支持的任何types的类声明,类扩展或类别中的任何属性:布尔值,整数或浮点数,string,本地化string,矩形,点,大小,颜色,范围和零。
问:如何在Interface Builder的属性检查器中看到一个enum
?
Swift 3
@IBInspectable var shape:StatusShape = .Rectangle
仅在Interface Builder中创build一个空白条目:
使用一个适配器,它将充当Swift和Interface Builder之间的桥梁 。
shapeAdapter
可从IB进行检查:
// IB: use the adapter @IBInspectable var shapeAdapter:Int { get { return self.shape.rawValue } set( shapeIndex) { self.shape = StatusShape(rawValue: shapeIndex) ?? .Rectangle } }
与条件编译方法(使用#if TARGET_INTERFACE_BUILDER
)不同, shape
variables的types不随目标而改变,可能需要进一步的源代码更改来处理shape:NSInteger
与shape:StatusShape
变体:
// Programmatically: use the enum var shape:StatusShape = .Rectangle
完整的代码
@IBDesignable class ViewController: UIViewController { enum StatusShape:Int { case Rectangle case Triangle case Circle } // Programmatically: use the enum var shape:StatusShape = .Rectangle // IB: use the adapter @IBInspectable var shapeAdapter:Int { get { return self.shape.rawValue } set( shapeIndex) { self.shape = StatusShape(rawValue: shapeIndex) ?? .Rectangle } } }
►在GitHub上find这个解决scheme。
而不是用整数设置你的可检查的枚举,你也可以用string来设置它们。 虽然不如下拉菜单更好,但至less该选项提供了一定程度的可读性。
Swift-only选项:
// 1. Set up your enum enum Shape: String { case Rectangle = "rectangle" // lowercase to make it case-insensitive case Triangle = "triangle" case Circle = "circle" } // 2. Then set up a stored property, which will be for use in code var shape = Shape.Rectangle // default shape // 3. And another stored property which will only be accessible in IB (because the "unavailable" attribute prevents its use in code) @available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'shape' instead.") @IBInspectable var shapeName: String? { willSet { // Ensure user enters a valid shape while making it lowercase. // Ignore input if not valid. if let newShape = Shape(rawValue: newValue?.lowercased() ?? "") { shape = newShape } } }
也可以通过在枚举中添加一个初始化工具来获得这个工作。 但是,编译器只会在swift代码中显示仅用于IB的属性的“不可用”错误。
具有Obj-C兼容性的Swift选项:
@objc enum Shape: Int { case None case Rectangle case Triangle case Circle init(named shapeName: String) { switch shapeName.lowercased() { case "rectangle": self = .Rectangle case "triangle": self = .Triangle case "circle": self = .Circle default: self = .None } } } var shape = Shape.Rectangle // default shape @available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'shape' instead.") @IBInspectable var shapeName: String? { willSet { if let newShape = Shape(rawValue: newValue?.lowercased() ?? "") { shape = newShape } } }
我不记得快速的语法,但这是我在obj-c解决它
#if TARGET_INTERFACE_BUILDER @property (nonatomic) IBInspectable NSInteger shape; #else @property (nonatomic) StatusShape shape; #endif
你不能。 如果您希望它在Interface Builder中可用,请使您的属性成为受支持的types之一。 在这种情况下,将其设置为int并将其转换为代码中的枚举types。
Swift 3基于SwiftArchitect的解决scheme
enum StatusShape: Int { case rectangle, triangle, circle } var statusShape: StatusShape = .rectangle #if TARGET_INTERFACE_BUILDER @IBInspectable var statusShapeIB: Int { get { return statusShape.rawValue } set { guard let statusShape = StatusShape(rawValue: newValue) else { return } self.statusShape = statusShape } } //convenience var, enum not inspectable #endif
这是一个古老的线程,但有用。 我已经适应了我的答案迅速4.0和Xcode 9.0 – Swift 4有这个问题自己的小问题。 我有一个@IBInspectablevariables与枚举types和Xcode 9.0不高兴,告诉我这个“属性不能被标记@IBInspectable,因为它的types不能在Objective-c中表示”
@Eporediese部分回答了这个问题(对于swift3) 使用故事板的属性,但直接枚举代码的其余部分。 下面是一个更完整的代码集,给你一个财产,在这两种情况下工作。
enum StatusShape: Int { case Rectangle = 0 case Triangle = 1 case Circle = 2 } var _shape:StatusShape = .Rectangle // this is the backing variable #if TARGET_INTERFACE_BUILDER @IBInspectable var shape: Int { // using backing variable as a raw int get { return _shape.rawValue } set { if _shape.rawValue != newValue { _shape.rawValue = newValue } } } #else var shape: StatusShape { // using backing variable as a typed enum get { return _shape } set { if _shape != newValue { _shape = newValue } } } #endif