interface-builder ibdesignable

interface builder - Error al representar la instancia de ClassName: el agente lanzó una excepción al cargar la pluma en el paquete



interface-builder ibdesignable (2)

Cuando incluyo mi vista personalizada de IBDesignable en un guión gráfico u otra punta, el agente se bloquea y lanza una excepción porque no puede cargar la punta.

error: IB Designables: no se pudo actualizar el estado de diseño automático: el agente generó una excepción "NSInternalInconsistencyException": no se pudo cargar el NIB en el paquete: ''NSBundle (cargado)'' con el nombre ''StripyView''

Aquí está el código que utilizo para cargar la punta:

override init(frame: CGRect) { super.init(frame: frame) loadContentViewFromNib() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) loadContentViewFromNib() } func loadContentViewFromNib() { let nib = UINib(nibName: String(StripyView), bundle: nil) let views = nib.instantiateWithOwner(self, options: nil) if let view = views.last as? UIView { view.frame = bounds view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] addSubview(view) } }

La vista se carga correctamente desde la punta cuando ejecuto en el simulador, ¿por qué no se muestra en el Interface Builder?


Cuando Interface Builder presenta sus vistas de IBDesignable , utiliza una aplicación auxiliar para cargar todo. El resultado de esto es que mainBundle en el momento del diseño está relacionado con la aplicación auxiliar, y no es el mainBundle su aplicación. Puede ver que la ruta mencionada en el error no tiene nada que ver con su aplicación:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays

Al cargar la pluma, confía en el hecho de que al pasar el bundle: nil predeterminada en el mainBundle la aplicación en el tiempo de ejecución.

let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)

Así que en lugar de eso, necesitas pasar el paquete correcto aquí. Corrige la línea anterior con lo siguiente:

let bundle = Bundle(for: StripyView.self) let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)

Eso hará que Interface Builder cargue su plumilla del mismo paquete que su clase de vista personalizada.

Esto se aplica a cualquier cosa que se cargue desde un paquete por su vista personalizada. Por ejemplo, cadenas localizadas, imágenes, etc. Si está usando estas en su vista, asegúrese de usar el mismo enfoque y pase explícitamente el paquete para la clase de vista personalizada.


El mismo punto de vista con "Josh Heald", no podemos pasar a cero por paquete. Y esta para quien en objeto - C:

- (UIView *) loadViewFromNib{ NSBundle *bundle = [NSBundle bundleForClass:[self class]]; UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle]; UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0]; return v; }