enum es no un Generador de Interfaz definida en tiempo de ejecución atributo.
La siguiente no se muestra en la Interfaz del Generador de Atributos del Inspector:

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

De la documentación:
Puede adjuntar el IBInspectable atributo a cualquier propiedad en la declaración de la clase, extensión de la clase, categoría o de cualquier tipo que sea compatible con el Interface Builder definido de tiempo de ejecución de atributos: booleano, entero o número de punto flotante, cadena, cadena localizada, rectángulo, de punto, tamaño, color, rango, y nil.

P: ¿Cómo puedo ver un enum en el Interface Builder Atributos del Inspector?

  • Donde se enum en esa lista? ¿Por qué usted piensa que usted puede utilizar una enumeración?
  • Sería agradable ser capaz de recoger un enum caso directamente de IB supongo, o un UIFont, como los nativos UIKit objetos.

6 Comentarios

  1. 68

    Swift 3

    @IBInspectable var shape:StatusShape = .Rectangle simplemente crea una entrada en blanco en el Interface Builder:

    Cómo crear un IBInspectable de tipo enum

    Uso de un adaptador, que actúa como un puente entre Swift y el Interface Builder.

    shapeAdapter es inspectable de IB:

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

    Cómo crear un IBInspectable de tipo enum

    A diferencia de la compilación condicional enfoque (utilizando #if TARGET_INTERFACE_BUILDER), el tipo de la shape variable no cambia con el objetivo de, potencialmente, requiriendo más cambios al código fuente para hacer frente con el shape:NSInteger vs shape:StatusShape variaciones:

       //Programmatically: use the enum
       var shape:StatusShape = .Rectangle

    Código completo

    @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
            }
        }
    }

    ► Encontrar esta solución en GitHub.

    • ¿Por qué se conservan los shapeAsInt como bienes almacenados en lugar de una exploración de la propiedad?
    • Me refiero a ¿por qué no hacer algo así
    • A la derecha. Usted no puede hacer que una propiedad writeonly, aunque… pero un calculada propiedad no crear un respaldo de la variable de instancia como la de sus bienes almacenados hace.
    • Añadido un no hay almacén de respaldo solución propuesta por @nhgrif.
    • Disculpe mi downvote. Pensé que había una solución de trabajo con TARGET_INTERFACE_BUILDER pero me engañaron. Lo siento, la mejor de las suertes aquí en TAN
    • avance rápido hasta el 2017 no esta el problema sigue siendo el mismo?
    • Yo estaba buscando si era posible utilizar las enumeraciones o una matriz, etc. Sin embargo todo lo que puedo encontrar es la información de 2015 o antes, así que me preguntaba si en 2017 con xcode 8.2.1 todavía es el mismo que hace 2 años o así que hace
    • No, todavía una solución relevante de Xcode 8.2.1. Ver ViewController.swift en la línea 37 sobre github.com/SwiftArchitect/SO-27432736: shape se @IBInspectable aún no es visible en IB

  2. 34

    En lugar de ajustar su inspectable las enumeraciones con enteros, también se podría establecer con cadenas. Aunque no es tan preferible como un menú desplegable, al menos esta opción ofrece cierto nivel de legibilidad.

    Swift única Opción:

    //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
            }
        }
    }

    Se es posible también obtener este para trabajar con objective-c, así, mediante la adición de un inicializador para la enumeración. Sin embargo, el compilador sólo se mostrará el «error» disponible para su IB-sólo las propiedades en el código swift.

    Swift Opción con Obj-C Compatibilidad:

    @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
            }
        }
    }
    • Me gusta la Swift Only versión: permite la llanura inglés en IB.
  3. 20

    No recuerdo el swift de la sintaxis, pero esto es cómo lo resuelto en obj-c

    #if TARGET_INTERFACE_BUILDER
    @property (nonatomic) IBInspectable NSInteger shape;
    #else
    @property (nonatomic) StatusShape shape;
    #endif
    • El único lugar que tengo el condicional de la asamblea es que una mancha en la declaración. No condicional de la asamblea en cualquier otro lugar, desde un enum es un valor entero en obj-c. Un punto a quitar cuando apple corrige esto (suponiendo que se va.)
    • Este es un ingenioso y maravilloso solución, y aquí mencionadas nshipster.com/ibinspectable-ibdesignable
  4. 3

    Este es un hilo viejo, pero útil. He adaptado mi respuesta a swift 4.0 y Xcode 9.0 – Swift 4 tiene su propio pequeño problemas con este problema. Estoy teniendo un @IBInspectable variable con un tipo enum y Xcode 9.0 no es feliz, me muestra esta «Propiedad no pueda ser marcado con @IBInspectable debido a que su tipo no se puede representar en Objective-c»

    @Eporediese respuestas a este problema (por swift3) en parte; el uso de una propiedad para el guión, pero una recta enum para el resto del código. A continuación es el más completo conjunto de códigos que le da la propiedad a trabajar con en ambos casos.

    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
  5. 1

    Swift 3
    solución basada en SwiftArchitect

    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
    • Si ajusta esta IB-inspectable propiedad en un #if TARGET_INTERFACE_BUILDER bloque sólo afecta a la representación en el Interface Builder, no en tiempo de ejecución. Esto va a resultar en un comportamiento inesperado y siempre obtendrá una advertencia en la consola: Failed to set (statusShapeIB) user defined inspected property ...: this class is not key value coding-compliant for the key statusShapeIB.
  6. -1
    I just removed @IBInspectable keyword 
    //MARK:- Not confirm its will work for other or not but easy way once you can try it

    desde donde aparecía un error (que era el doble para mí). Para ello será necesario que
    desbloquear el VHBoomMenuButton de la biblioteca para que pueda hacer cambios.

    and its work  

Dejar respuesta

Please enter your comment!
Please enter your name here