Nib de carga para UIView utilizado en ViewController en StoryBoard
uiviewcontroller uistoryboard (3)
Tengo una vista UIV que quiero usar en varios controladores de vista, así que creé la vista (.h / .m) y un archivo de plumilla para ella. En la vista del Guión gráfico se agrega como subvista para ver el controlador, pero no carga el diseño como se define en la punta.
¿Es posible cargar la punta de una vista UIV utilizada en un controlador de vista en un Storyboard?
Nombra tu vista ViewInNib
, entonces tenemos:
- ViewInNib.h
- ViewInNib.m
- ViewInNib.xib
En su guión gráfico, coloque un componente UIView de placeholder
en el controlador de vista, recuerde establecer su clase ViewInNib
, luego en ViewInNib.m
:
static BOOL isReplaced = NO;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
if (!isReplaced)
{
isReplaced = YES;
ViewInNib *replaced = [[[NSBundle mainBundle] loadNibNamed:@"ViewInNib" owner:nil options:nil] lastObject];
replaced.frame = self.frame;
replaced.translatesAutoresizingMaskIntoConstraints = NO;
return replaced;
}
isReplaced = NO;
return self;
}
En este método, reemplazamos la vista real cargada desde la punta de la vista en el guión gráfico. Espero eso ayude.
Si pregunta sobre ver su contenido .xib en Interface Builder cuando edita Storyboard, no es posible . Pero si necesitas cargarlo en tiempo de ejecución, es posible .
- .h / .m debe contener una subclase UIView
- en el archivo .xib , debe configurar el propietario del archivo ( Identity Inspector -> Custom Class ) con su subclase UIView personalizada
- en el archivo .h agregue
@property (strong, nonatomic) IBOutlet UIView* view;
y conecte su contenedor de vistas desde Interface Builder a este campo ( Ctrl + Clic en Ver y arrastrar la conexión a la propiedad de laview
anterior en .h - conectar otras subvistas a .h
- en el archivo .m necesitas colocar
- (void)awakeFromNib {
NSString* nibName = @"Place here your Nib name without extension";
if ([[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]) {
[self.view setFrame:[self bounds]];
[self addSubview:self.view];
}
}
Eso es todo. Mueva la escena View to Storyboard , cambie la clase personalizada a su FooView , importe .h en el código de View Controller y use IBOutlets como desee.
Tener feliz codificación
EDITAR
Quiero advertir que, de acuerdo awakeFromNib
documentation awakeFromNib
, debemos evitar dicho código en awakeFromNib
.
Se recomienda que mantenga una correspondencia de uno a uno entre los objetos Propietario del archivo y sus archivos de plumillas asociados. La carga de dos archivos nib con el mismo objeto Propietario del archivo hace que se llame dos veces al método awakeFromNib del objeto, lo que podría hacer que algunas estructuras de datos se reinicialicen de forma no deseada. También se recomienda que evite cargar otros archivos nib de la implementación del método awakeFromNib.
utilizar XXNibBridge:
https://github.com/sunnyxx/XXNibBridge
Súper simple de usar y funciona con Swift también. El crédito completo es para @sunnyxx