首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建枚举类型的IBInspectable

如何创建枚举类型的IBInspectable
EN

Stack Overflow用户
提问于 2014-12-12 05:30:13
回答 6查看 31.3K关注 0票数 85

enum,而不是接口生成器定义的运行时属性。以下内容不会显示在界面生成器的属性检查器中:

代码语言:javascript
复制
enum StatusShape:Int {
    case Rectangle = 0
    case Triangle = 1
    case Circle = 2
}
@IBInspectable var shape:StatusShape = .Rectangle

文档中的内容:对于接口生成器定义的运行时特性所支持的任何类型,您可以将IBInspectable特性附加到类声明、类扩展或类别中的任何特性:布尔值、整数或浮点数、字符串、本地化字符串、矩形、点、大小、颜色、范围和nil。

Q:如何在接口生成器的属性检查器中看到enum

EN

回答 6

Stack Overflow用户

发布于 2014-12-12 09:08:27

Swift 3

@IBInspectable var shape:StatusShape = .Rectangle仅在界面生成器中创建一个空白条目:

使用适配器,它将充当Swift和接口生成器之间的

可从IB检查shapeAdapter

代码语言:javascript
复制
   // 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:NSIntegershape:StatusShape的变化:

代码语言:javascript
复制
   // Programmatically: use the enum
   var shape:StatusShape = .Rectangle

完整代码

代码语言:javascript
复制
@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上找到这个解决方案。

票数 76
EN

Stack Overflow用户

发布于 2015-08-25 07:31:57

除了使用int设置可检查枚举之外,您还可以使用字符串设置它们。虽然不像dropdown那样可取,但至少这个选项提供了一定程度的可读性。

仅限Swift选项:

代码语言:javascript
复制
// 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选项:

代码语言:javascript
复制
@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
        }
    }
}
票数 43
EN

Stack Overflow用户

发布于 2015-03-06 07:16:07

我不记得swift语法了,但这就是我在obj-c中解决它的方法

代码语言:javascript
复制
#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27432736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档