No se pudo cargar IBDesignable xib en el generador de interfaces

Tengo un xib ( childXib ) vinculado a su file UIView rápido personalizado a través de su Owner .

Así es como inicializo mi UIView personalizada:

 // init for IBDesignable override init(frame: CGRect) { super.init(frame: frame) let view = loadViewFromNib() view.frame = bounds addSubview(view) } requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) addSubview(loadViewFromNib()) } func loadViewFromNib() -> UIView { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "CommentCellView", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } 

Cuando quiero agregar este xib ( childXib ) en otro xib ( parentXib ), obtengo los siguientes errores:

 error: IB Designables: Failed to render instance of MyRootView: The agent threw an exception. 

Donde MyRootView es el file vinculado a parentXib

 error: IB Designables: Failed to update auto layout status: The agent raised a "NSInternalInconsistencyException" exception: Could not load NIB in bundle: 'NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)' with name 'MyIBDesignableCustomViewFilename' 

Donde MyIBDesignableCustomViewFilename es el file vinculado a childXib .

Cuando lo depuro haciendo clic en Debug en Custom class desde el Identity inspector , no funciona desde esa línea:

 let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 

Todos los files xib están en Copy Bundle Resources en Build Phases .

¿Alguna idea de lo que está mal?

Primer paso:

Te daré una introducción a IBDesignable e IBInspectable, y les mostraré cómo aprovechar la nueva característica. No hay mejor manera de elaborar una function que crear una demostración. Entonces, buildemos una interfaz personalizada llamada "Rainbow" juntas.

IBDesignable e IBInspectable

Con IBDesignable e IBInspectable, los desarrolladores pueden crear la interfaz (o vista) que se renderiza en Interface Builder en time real. En general, para aplicar esta nueva function, todo lo que necesita hacer es crear una class visual subclarando UIView o UIControl y luego prefijar el nombre de la class con la palabra key @IBDesignable en Swift. Si está utilizando Objective-C, use la macro IB_DESIGNABLE en su lugar. Aquí hay un código de muestra en Swift:

 @IBDesignable class Rainbow: UIView { } 

En las versiones anteriores de Xcode, puede editar los attributes de time de ejecución definidos por el usuario para cambiar las properties de un object (por ejemplo, layer.cornerRadius) en Interface Builder. El problema es que debe ingresar el nombre exacto de las properties. IBInspectable da un paso adelante. Cuando prefiere una propiedad de la class visual con IBInspectable, la propiedad estará expuesta al Interface Builder de manera que pueda cambiar su valor de una manera muy directa:

introduzca la descripción de la imagen aquí

De nuevo, si está desarrollando su aplicación en Swift, lo que tiene que hacer es simplemente prefijar su propiedad elegida con la palabra key @IBInspectable. Aquí hay un ejemplo de fragment de código:

 @IBInspectable var firstColor: UIColor = UIColor.blackColor() { // Update your UI when value changes } @IBInspectable var firstColor: UIColor = UIColor.blackColor() { // Update your UI when value changes } 

Construyendo su proyecto Xcode

Comencemos creando un nuevo proyecto en Xcode y elija la aplicación Single View como plantilla, y denomínelo RainbowDemo. Usaremos Swift en este proyecto como el lenguaje de progtwigción, así que no olvides elegirlo cuando crees el proyecto.

Una vez finalizado, select Main.storyboard en Project Navigator y arrastre un object View desde Object Library hasta View Controller. Cambie su color a # 38334C (o el color que desee), así como configure su tamaño a 600 por 434. A continuación, colóquelo en el centro de la vista principal. No olvide cambiar el color de la vista principal al mismo color del object de vista. Consejo: si desea cambiar los valores de Color RGB para su código, simplemente abra su Paleta de colors y cambie a la pestaña Deslizadores para modificar los valores RGB.

Confundirse Sin preocupaciones. Comprenderás lo que quiero decir después de pasar por la demostración del proyecto.

Con Xcode 6, debe configurar restricciones de layout automático para la vista para admitir todos los types de dispositivos iOS. El layout automático es bastante potente en la última versión de Xcode. Para restricciones simples, simplemente click la opción Problemas del menu Diseño automático y elija "Agregar restricciones faltantes", y Xcode configurará automáticamente las restricciones de layout para la vista.

introduzca la descripción de la imagen aquí

Crear class de vista personalizada

Ahora que ha creado la vista en el guión gráfico, es hora de crear nuestra class de vista personalizada. Utilizaremos la plantilla de la class Swift para la creación de la class. Nómbrelo "Arco Iris".

introduzca la descripción de la imagen aquí

 Then insert the following code in the class: import UIKit class Rainbow: UIView { requinetworking init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(frame: CGRect) { super.init(frame: frame) } } 

Como se mencionó anteriormente, la class visual es una subclass de UIView. Para utilizar nuestra class personalizada en renderizado en vivo, debemos anular ambos inicializadores como se muestra arriba. Luego divide la vista seleccionando el editor asistente:

introduzca la descripción de la imagen aquí

Una vez hecho esto, select el guión gráfico principal en el editor asistente, para que pueda ver lo que está construyendo en time real. Recuerde cambiar el nombre de class de la vista a "Arco iris" en el Inspector de identidad:

Implementación de controles IBDesignable

El primer paso para habilitar un control para renderizado en vivo es configurar la vista personalizada como Designable prefijando el nombre de class con @IBDesignable:

 @IBDesignable class Rainbow: UIView { ... } 

Es un poco simple como puedes ver. Pero esta simple palabra key haría que su desarrollo sea mucho más fácil. A continuación, agregaremos algunas properties para configurar los colors de los círculos. Inserte estas líneas de código en la class Rainbow:

 @IBInspectable var firstColor: UIColor = UIColor(networking: (37.0/255.0), green: (252.0/255), blue: (244.0/255.0), alpha: 1.0) @IBInspectable var secondColor: UIColor = UIColor(networking: (171.0/255.0), green: (250.0/255), blue: (81.0/255.0), alpha: 1.0) @IBInspectable var thirdColor: UIColor = UIColor(networking: (238.0/255.0), green: (32.0/255) 

Aquí, pnetworkingefinimos cada propiedad con un color pnetworkingeterminado y le decimos que vuelva a dibujar la vista cada vez que un usuario cambia su valor. Lo más importante es que prefijamos cada propiedad con la palabra key @IBInspectable. Si va a los attributes que son inspeccionables de la vista, debería encontrar estas properties visualmente:

Cool, ¿verdad? Al indicar las properties como IBInspectable, puede editarlas visualmente con el selector de color.

Ok vamos a implementar los principales methods de la class Rainbow, que se utiliza para dibujar un círculo en la pantalla. Inserte el siguiente método en la class:

 func addOval(lineWidth: CGFloat, path: CGPathRef, strokeStart: CGFloat, strokeEnd: CGFloat, strokeColor: UIColor, fillColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float, shadowOffsset: CGSize) { let arc = CAShapeLayer() arc.lineWidth = lineWidth arc.path = path arc.strokeStart = strokeStart arc.strokeEnd = strokeEnd arc.strokeColor = strokeColor.CGColor arc.fillColor = fillColor.CGColor arc.shadowColor = UIColor.blackColor().CGColor arc.shadowRadius = shadowRadius arc.shadowOpacity = shadowOpacity arc.shadowOffset = shadowOffsset layer.addSublayer(arc) } 

introduzca la descripción de la imagen aquí

Para que el código sea limpio y legible, creamos un método común para dibujar un círculo completo o semicírculo según los parameters proporcionados por la persona que llama. Es bastante sencillo dibujar un círculo o un arco usando la class CAShapeLayer. Puede controlar el inicio y el final de la descarga utilizando las properties strokeStart y strokeEnd. Al variar el valor de stokeEnd entre 0.0 y 1.0, puede dibujar un círculo completo o parcial. El rest de las properties solo se utilizan para establecer el color de un trazo, el color de la sombra, etc. Puede consultar la documentation oficial para get detalles de todas las properties disponibles en CAShapeLayer.

A continuación, inserte los siguientes methods en la class Rainbow:

 override func drawRect(rect: CGRect) { // Add ARCs self.addCirle(80, capRadius: 20, color: self.firstColor) self.addCirle(150, capRadius: 20, color: self.secondColor) self.addCirle(215, capRadius: 20, color: self.thirdColor) } func addCirle(arcRadius: CGFloat, capRadius: CGFloat, color: UIColor) { let X = CGRectGetMidX(self.bounds) let Y = CGRectGetMidY(self.bounds) // Bottom Oval let pathBottom = UIBezierPath(ovalInRect: CGRectMake((X - (arcRadius/2)), (Y - (arcRadius/2)), arcRadius, arcRadius)).CGPath self.addOval(20.0, path: pathBottom, strokeStart: 0, strokeEnd: 0.5, strokeColor: color, fillColor: UIColor.clearColor(), shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSizeZero) // Middle Cap let pathMiddle = UIBezierPath(ovalInRect: CGRectMake((X - (capRadius/2)) - (arcRadius/2), (Y - (capRadius/2)), capRadius, capRadius)).CGPath self.addOval(0.0, path: pathMiddle, strokeStart: 0, strokeEnd: 1.0, strokeColor: color, fillColor: color, shadowRadius: 5.0, shadowOpacity: 0.5, shadowOffsset: CGSizeZero) // Top Oval let pathTop = UIBezierPath(ovalInRect: CGRectMake((X - (arcRadius/2)), (Y - (arcRadius/2)), arcRadius, arcRadius)).CGPath self.addOval(20.0, path: pathTop, strokeStart: 0.5, strokeEnd: 1.0, strokeColor: color, fillColor: UIColor.clearColor(), shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSizeZero) } 

La implementación pnetworkingeterminada del método drawRect no hace nada. Para dibujar círculos en la vista, anulamos el método para implementar nuestro propio código de dibujo. El método addCircle tiene tres parameters: arcRadius, capRadius y color. El arcRadius es el radio del círculo, mientras que el capRadius es el radio de la tapa networkingondeada.

El método addCircle usa UIBezierPath para dibujar los arcos y funciona así:

 First it draws a half circle at the bottom Next it draws a full small circle at the edge of the arc. Finally, it draws the other half of the circle 

En el método drawRect, llamamos al método addCircle tres veces con diferente radio y color. Esta figura ilustra cómo se dibujan los círculos: introduzca la descripción de la imagen aquí

Consejo: Si necesita más información sobre UIBezierPath, puede consultar la documentation oficial de Apple.

Con las properties IBInspectable, ahora puede cambiar el color de cada círculo directamente en el Interface Builder sin zambullirse en el código:

Obviamente, puede exponer más a arcRadius como una propiedad de IBInspectable. Lo dejaré como un ejercicio para ti.

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

para el código de ejemplo haga clic aquí: https://github.com/appcoda/Rainbow-IBDesignable-Demo

Estaba teniendo el mismo problema y pude solucionarlo.

Swift 3

 let bundle = Bundle(for: MyView.self) let view = UINib(nibName: "MyView", bundle: bundle).instantiate(withOwner: self) as! MyView 

La parte importante es el package

Para ambos errores como a continuación:

 error: IB Designables: Failed to render instance of .... error: IB Designables: Failed to update auto layout status: The agent raised a "NSInternalInconsistencyException" exception: Could not load NIB in bundle ... 

Sugiero que tener una pequeña auto verificación rápida pueda ayudar a determinar dónde deben abordarse los problemas:

  1. Compruebe si los files .xib se agregan correctamente a un proyecto.
  2. Compruebe si nibName está configurado correctamente, a veces ocurre un error al escribir aquí.
  3. Compruebe si la salida y la acción están conectadas adecuadamente, incluya la implementación de códigos