failed example designables create bool ios xcode swift interface-builder

ios - example - ibinspectable bool



@IB Agente de bloqueo designable (10)

Cuando escribo mi propia clase UIButton -extended y la hago @IBDesignable , recibo dos errores en Interface Builder, a saber:

  • Main.storyboard: error: IB Designables: Error al actualizar el estado del diseño automático: el agente se bloqueó porque el fd se cerró
  • Main.storyboard: error: IB Designables: no se pudo procesar la instancia de RandjeUIButton: el agente se bloqueó

Aquí está mi código:

import UIKit @IBDesignable class RandjeUIButton: UIButton { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.backgroundColor = UIColor.blackColor() } }

Estoy trabajando en Xcode 7 beta 2 en OS X 10.11 beta 2. (Ejecutando en VM)


Así es como resuelvo este problema:

  • Asegúrese de que las salidas estén correctamente inicializadas
  • Las propiedades de @IBInspectable se inicializarían correctamente
  • en el archivo xib, haga clic en el marcador de posición del propietario del archivo, vaya al inspector de identidad, asegúrese de que no tenga valores predeterminados

import UIKit @IBDesignable class TestView: UIView { @IBOutlet weak var label: UILabel! @IBInspectable var textLabel1: String? { get { return label.text } set { label.text = newValue } } // MARK: Setup var view1: UIView! var nibName: String = "TestView" override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } private func xibSetup() { view1 = loadViewFromNib() view1?.frame = self.bounds view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] if view1 != nil { addSubview(view1!) //textLabel1 = "ok" } } private func loadViewFromNib() -> UIView? { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: nibName, bundle: bundle) for object in nib.instantiateWithOwner(self, options: nil) { if let view: UIView = object as? UIView { return view } } return nil } }

Uso:


El generador de interfaces de Xcode requiere que implemente ambos o ninguno de los inicializadores para que @IBDesignable clases @IBDesignable se representen correctamente en IB.

Si implementa required init(coder aDecoder: NSCoder) necesario, también deberá anular init(frame: CGRect) , de lo contrario "el agente se bloqueará" como se ve en los errores arrojados por Xcode.

Para hacerlo, agregue el siguiente código a su clase:

override init(frame: CGRect) { super.init(frame: frame) }


En Xcode 7.3, ninguna de las soluciones anteriores funcionó para mí, pero la respuesta aceptada a esta pregunta fue: No se pudo procesar la instancia de Designables de IB

  1. Borrar datos derivados de Xcode para el proyecto. Están en ~ / Library / Developer / Xcode / DerivedData
  2. Limpia tu construcción actual presionando ⌘⇧K
  3. Construye tu proyecto
  4. En el guión gráfico, vaya al menú Editor y actualice todas las vistas; espere a que se complete la compilación y los errores deberían desaparecer

No necesitaba hacer el cuarto paso para resolver el problema (y obtener mi PaintCode-drawRect''d UIView para pintar en el guión gráfico), incluido aquí por si acaso.

Crédito a @Mojtaba y @WeZZard


Encontré algo realmente importante al usar un UIImage en cualquier clase marcada @IBDesignable. El clásico UIImage init colapsaría al agente:

let myImage = UIImage(named: String) // crash the agent

La solución es usar este método init de UIImage:

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)

Código de trabajo ejemplo:

let appBundle = Bundle(for: type(of: self)) let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))

¿Dónde está tu clase con la palabra clave @IBDesignable? Xcode 9.4, Swift 4.1


Hay una miríada de problemas que pueden causar esto. Encienda la consola y busque el informe de bloqueo IBDesignablesCocoaTouch...

Acabo de resolver un problema con un tercero designado que tenía problemas con la semántica valueForKey .


He encontrado el mismo problema y lo he resuelto de esta manera:

  1. El problema:

error: Designables de IB: no se pudo actualizar el estado del diseño automático: el agente se bloqueó

  1. Busque el botón de depuración en el archivo de inspección y haga clic en él.

  1. Entonces el Xcode te dirá dónde está el prolem. En mi caso, dejo caer el IBDesignable antes de la clase.

  2. Luego lo limpio y lo reconstruyo, el error desapareció


Para mí, no fue usar #if !TARGET_INTERFACE_BUILDER que me #if !TARGET_INTERFACE_BUILDER . Básicamente tenía un código que daría como resultado el acceso a una ruta en mi paquete ...

Bundle.main.path(forResource: "Foo", ofType: "plist")

El problema es que cuando se ejecuta en IB (y no en su aplicación), Bundle.main no es su aplicación ...

(lldb) po Bundle.main NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)

Entonces, la respuesta a esto es simplemente revisar su código @IBDesignable UIView cuidadosamente y usar #if !TARGET_INTERFACE_BUILDER para cualquier cosa (en mi caso, llamadas a CoreLocation por ejemplo) que no tiene sentido cuando se ejecuta en tiempo de diseño.

Cómo depuré y encontré esto

Esto es lo que ve cuando usa el Editor -> Debug Selected View seleccionada mientras selecciona su @IBDesignable UIView en su guión gráfico:

Luego te estrellarás en la ubicación correcta

En mi caso, como puede ver, initXXXX estaba haciendo una initXXXX , que se bloqueaba en el momento del diseño, porque estaba buscando un valor en el archivo en mi Bundle, que es Xcode, en el momento del diseño.


Perdí un día completo en esto y finalmente resolví mi problema

Seleccioné Build para target como 8.0 y me soluciona todo.


Simplemente vuelva a abrir un código en otro sistema de configuración de Xcode. En mi caso funcionó.


XCode 10, Swift 4.2

Encontré una respuesta here

La solución fue simple: cambiar la forma en que se resolvió el paquete en el método required init?(coder aDecoder: NSCoder) de mi clase de vista personalizada.

Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

necesitaba ser cambiado a

let bundle = Bundle(for: TestView.self) bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)