enum
是,而不是接口生成器定义的运行时属性。以下内容不会显示在界面生成器的属性检查器中:
enum StatusShape:Int {
case Rectangle = 0
case Triangle = 1
case Circle = 2
}
@IBInspectable var shape:StatusShape = .Rectangle
文档中的内容:对于接口生成器定义的运行时特性所支持的任何类型,您可以将IBInspectable特性附加到类声明、类扩展或类别中的任何特性:布尔值、整数或浮点数、字符串、本地化字符串、矩形、点、大小、颜色、范围和nil。
Q:如何在接口生成器的属性检查器中看到enum
?
发布于 2014-12-12 09:08:27
Swift 3
@IBInspectable var shape:StatusShape = .Rectangle
仅在界面生成器中创建一个空白条目:
使用适配器,它将充当Swift和接口生成器之间的桥。
可从IB检查shapeAdapter
:
// 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
变量的类型不会随着目标的变化而改变,这可能需要进一步的源代码更改来应对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上找到这个解决方案。
发布于 2015-08-25 07:31:57
除了使用int设置可检查枚举之外,您还可以使用字符串设置它们。虽然不像dropdown那样可取,但至少这个选项提供了一定程度的可读性。
仅限Swift选项:
// 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
}
}
}
通过向枚举添加一个初始化器,也可以使其与objective-c一起工作。但是,编译器只会在swift代码中为您的IB-only属性显示“不可用”错误。
与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
}
}
}
发布于 2015-03-06 07:16:07
我不记得swift语法了,但这就是我在obj-c中解决它的方法
#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif
https://stackoverflow.com/questions/27432736
复制相似问题