ios - xcode カラーパレット




列挙型のIBInspectableを作成する方法 (4)

スイフト3

@IBInspectable var shape:StatusShape = .Rectangle は、Interface Builderで空のエントリを作成するだけです:

アダプターを使用します。アダプターは、SwiftとInterface Builderの間の ブリッジ として機能します。
shapeAdapter は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:NSIntegershape: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でこのソリューションを見つけ GitHub

enum は、Interface Builderで定義されたランタイム属性ではあり ません 。 以下は、Interface BuilderのAttributes Inspectorには表示されません。

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

ドキュメントから: IBInspectable属性は、Interface Builderで定義されたランタイム属性でサポートされるタイプのクラス宣言、クラス拡張、またはカテゴリのプロパティに添付できます:ブール、整数または浮動小数点数、文字列、ローカライズされた文字列、長方形、ポイント、サイズ、色、範囲、nil。

Q: Interface BuilderのAttributes Inspectorで enum を表示するにはどうすればよいですか?


これは古いスレッドですが、便利です。 私は自分の答えをswift 4.0とXcode 9.0に適応させました-Swift 4にはこの問題に関する小さな問題があります。 私は列挙型の@IBInspectable変数を持っていますが、Xcode 9.0は満足していません。「Objective-cではその型を表すことができないため、@ IBInspectableをマークできません」と表示されます。

@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

私は迅速な構文を覚えていないが、これは私がobj-cでそれを解決した方法です

#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif

SwiftArchitect 基づく Swift 3 ソリューション

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




interface-builder