UIView e initWithFrame y un archivo NIB. ¿Cómo puedo cargar el archivo NIB?

Tengo una UIView llamada baseView y en la que tengo initWithFrame donde agrego algunas otras vistas y hago algunas cosas personalizadas. La misma vista también tiene un archivo NIB.

Ahora tengo una clase UIViewController llamada AppController en la que quiero agregar la vista baseView a la vista de la vista AppController , así que estoy haciendo esto:

self.view = baseView; pero el problema es que el archivo NIB no se carga. ¿Cómo me aseguro de que las cosas personalizadas Y el archivo NIB se carguen / ejecuten?

Tiene muchas opciones, dependiendo de cómo su clase “baseView” esté destinada a ser utilizada e integrada en su aplicación. No está claro cómo se pretende utilizar esta clase, ya que la vista en una subclase UIViewController o como un componente modular reutilizable significa que se debe instanciar varias veces en toda la aplicación, para utilizarla en muchos controladores de visualización diferentes.

Si su vista está destinada a ser la única vista en una subclase UIViewController, entonces Phonitive es correcta: agréguelo junto con el archivo .xib de la subclase UIViewController y use viewDidLoad de UIViewController para realizar la inicialización final.

Pero si quiere que su clase View sea un subcomponente reutilizado varias veces en diferentes controladores de vista, integrado por código o mediante inclusión en un archivo .xib para otro controlador, entonces necesita implementar el método initWithFrame: init y awakeFromNib, para manejar ambos casos. Si su inicialización interna siempre incluye algunos objetos de .xib, entonces en su initWithFrame tendrá que cargar su .xib manualmente para soportar clases de “clientes” que quieran crear su widget a través del código. Y del mismo modo, si un archivo .xib contiene su objeto, deberá asegurarse de llamar a awakeFromNib desde cualquier finalización requerida por el código.

Aquí hay un ejemplo de cómo crear un componente de subclase UIView con el diseño de la interfaz de usuario en un plumín.

MyView.h:

 @interface MyView : UIView { UIView *view; UILabel *l; } @property (nonatomic, retain) IBOutlet UIView *view; @property (nonatomic, retain) IBOutlet UILabel *l; 

MyView.m:

 #import "MyView.h" @implementation MyView @synthesize l, view; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code. // [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; [self addSubview:self.view]; } return self; } - (void) awakeFromNib { [super awakeFromNib]; // commenters report the next line causes infinite recursion, so removing it // [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; [self addSubview:self.view]; } - (void) dealloc { [l release]; [view release]; [super dealloc]; } 

Así es como se ve el archivo nib (excepto que el propietario del archivo debe cambiarse a la clase MyView).

enter image description here

asegúrese de conectar tanto la vista como las salidas de tags al propietario del archivo. ¡Eso es! Una plantilla para crear widgets UIView reutilizables.

Lo realmente bueno de esta estructura es que puede colocar instancias de su objeto MyView en otros archivos semilla, simplemente coloque un UIView en la ubicación / tamaño que desee, luego cambie la clase en el inspector de identidad (CMD-4) a MyView, y boom, ¡tienes una instancia de tu widget en las vistas que quieras! Al igual que los objetos UIKit, puede implementar protocolos de delegado para que los objetos que utilicen su widget puedan ser notificados de eventos interesantes y puedan proporcionar datos para mostrarlos en el widget y personalizarlos.

Encontré esta publicación después de tener un problema al intentar hacer esto en mi aplicación. Intenté crear una instancia de la vista desde un NIB en el método ViewDidLoad, pero los controles actuaron como si estuvieran deshabilitados. Luché con esto tratando de establecer directamente la propiedad userInteractionEnabled y establecer programáticamente el selector de eventos táctiles para un botón en esta vista. Nada funcionó. Me encontré con otra publicación y descubrí que viewDidLoad probablemente era demasiado pronto para cargar este NIB. Moví la carga al método ViewWillAppear y todo funcionó. Espero que esto ayude a alguien más a luchar con esto. La respuesta principal fue excelente y me funciona bien ahora que la llamo desde el lugar correcto.

si desea utilizar un NIB, es mejor que su UIView esté vinculado con un UIViewController, en este caso puede usar

 UIViewController *vc=[[UIViewController alloc] initWithNibName:@"YourNIBWihtOUTEXTENSION" bundle:nil] [self.view addSubView:vc.view ]; 

teniendo en cuenta las pérdidas de memoria, tienes que lanzar vc

Si tiene una UIView personalizada con un archivo xib.

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; id mainView; if (self) { NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"HomeAllAdsView" owner:self options:nil]; mainView = [subviewArray objectAtIndex:0]; } return mainView; } - (void) awakeFromNib { [super awakeFromNib]; } 

Esta publicación me ayudó a generar vistas reutilizables con el generador de interfaces y el diseño automático . El truco tenía que ver con configurar IBOutlets al FileOwner y luego agregar la vista de contenido a sí mismo después de cargar el plumín