如何创建类型枚举的IBInspectable

时间:2014-12-11 21:30:13

标签: ios xcode swift interface-builder

enum 是Interface Builder定义的运行时属性。 以下内容未在Interface Builder的属性检查器中显示:

enum StatusShape:Int {
    case Rectangle = 0
    case Triangle = 1
    case Circle = 2
}
@IBInspectable var shape:StatusShape = .Rectangle

从文档中: 您可以将IBInspectable属性附加到类声明,类扩展或类别中的任何属性,以用于Interface Builder定义的运行时属性支持的任何类型:布尔值,整数或浮点数,字符串,本地化字符串,矩形,点,大小,颜色,范围和零。

问:如何在Interface Builder的属性检查器中看到enum

6 个答案:

答案 0 :(得分:67)

Swift 3

@IBInspectable var shape:StatusShape = .Rectangle仅在Interface Builder中创建一个空白条目:

Not available in IB

使用适配器,它将充当Swift和Interface Builder之间的桥接器 IB可以检查shapeAdapter

   // IB: use the adapter
   @IBInspectable var shapeAdapter:Int {
        get {
            return self.shape.rawValue
        }
        set( shapeIndex) {
            self.shape = StatusShape(rawValue: shapeIndex) ?? .Rectangle
        }
    }

Available in IB

与条件编译方法(使用#if TARGET_INTERFACE_BUILDER)不同,shape变量的类型不随目标而变化,可能需要进一步更改源代码以应对shape:NSInteger vs 。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上找到此解决方案。

答案 1 :(得分:20)

我不记得swift语法,但这就是我在obj-c

中解决它的方法
#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif

答案 2 :(得分:4)

对于2020年-@SwiftArchitect答复今天已更新

这是当今所有语法的典型完整示例

enter image description here

import UIKit

@IBDesignable class ClipLabels: UILabel {

    enum Side: Int { case left, right }

    var side: Side = .left {
        didSet {
            common()
        }
    }

    @available(*, unavailable, message: "IB only")
    @IBInspectable var leftRight01: Int {
        get {
            return self.side.rawValue
        }
        set(index) {
            self.side = Side(rawValue: index) ?? .left
        }
    }

只是一个使用示例...

switch side {
    case .left:
        textColor = .red
    case .right:
        textColor = .green
    }

对于这个关键的Swift / iOS质量检查,

•@SwiftArchitect的非常老的答案是完全正确的,但

•我刚刚对其进行了更新,并添加了关键的“不可用”内容,现在在Swift中可以实现。

答案 3 :(得分:3)

这是一个旧线程,但很有用。我已经调整了我对swift 4.0和Xcode 9.0的答案--Swift 4对这个问题有自己的小问题。我有一个带有枚举类型的@IBInspectable变量,并且Xcode 9.0不满意,向我显示这个"属性不能标记为@IBInspectable,因为它的类型不能在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

答案 4 :(得分:1)

Swift 3 基于the declarations

的解决方案
keyboardDistanceFromTextField

答案 5 :(得分:-1)

I just removed @IBInspectable keyword 
//MARK:- Not confirm its will work for other or not but easy way once you can try it

出现该错误的位置(对我来说这是两次)。这将要求您     解锁VHBoomMenuButton库,以便您进行更改。

and its work