@IB agente crashing designable

Cuando escribo mi propio UIButton -extended class y lo hago @IBDesignable , recibo dos errores en Interface Builder, a saber:

  • Main.storyboard: error: IB Designables: no se pudo actualizar el estado de layout automático: el agente se bloqueó porque fd se cerró
  • Main.storyboard: error: IB Designables: No se pudo representar la instancia de RandjeUIButton: el agente se bloqueó

Aquí está mi código:

 import UIKit @IBDesignable class RandjeUIButton: UIButton { requinetworking 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. (Ejecución en VM)

Xcode's Interface Builder requiere que implemente ambos o ninguno de los inicializadores para que @IBDesignable classs @IBDesignable se @IBDesignable correctamente en IB.

Si implementa requinetworking init(coder aDecoder: NSCoder) , necesitará anular init(frame: CGRect) , de lo contrario, "el agente se bloqueará" como se ve en los errores generados por Xcode.

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

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

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

  1. El problema:

error: IB Designables: no se pudo actualizar el estado de layout automático: el agente se bloqueó

  1. Busque el button de debugging en el file de inspección y click él.

depurar

  1. Luego, el Xcode te dirá dónde está el prolem. En mi caso, IBDesignable el IBDesignable antes de la class.

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

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

  1. Borrar los datos derivados de Xcode para el proyecto. Están en ~ / Library / Developer / Xcode / DerivedData
  2. Limpia tu compilation actual presionando ⌘⇧K
  3. Construya su proyecto
  4. En el guión gráfico, vaya al menu Editor y haga Actualizar todas las vistas; espere a que finalice la construcción y los errores deberían desaparecer

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

Crédito a @Mojtaba y @WeZZard

Hay una miríada de problemas que pueden causar esto. Encienda la console y busque el informe del crash IBDesignablesCocoaTouch...

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

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

Para mí, no estaba usando #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 package …

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

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

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

Por lo tanto, la respuesta a esto es simplemente revisar cuidadosamente su código @IBDesignable UIView 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 time de layout.

Cómo depuré y encontré esto

Esto es lo que ves cuando utilizas el Editor -> Debug Selected View seleccionada mientras seleccionas tu @IBDesignable UIView en tu guión gráfico:

Esto es lo que ve cuando usa el <code> Editor -> Depurar la vista seleccionada </ code> mientras selecciona su <code> @IBDesignable UIView </ code> en su guión gráfico

Luego te estrellarás en la location correcta.

El navegador de depuración

En mi caso, como puedes ver, initXXXX estaba haciendo un assert , que se estaba estrellando en el momento del layout, porque estaba buscando un valor en el file en mi package, que es Xcode, en el momento del layout.

Así es como resuelvo este problema:

  • Asegúrese de que las tomas se hayan inicializado correctamente.
  • Las properties @IBInspectable se inicializarían correctamente
  • en el file xib, click el marcador de position del propietario del file, vaya al inspector de identidad, asegúrese de que no tenga ningún valor pnetworkingeterminado
 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() } requinetworking 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 } }