Agregar una subvista personalizada (creada en un xib) a la vista de un controller de vista – ¿Qué estoy haciendo mal?

He creado una vista en un xib (con un indicador de actividad, una vista de progreso y una label). Luego he creado files .h / .m:

#import <UIKit/UIKit.h> @interface MyCustomView : UIView { IBOutlet UIActivityIndicatorView *actIndicator; IBOutlet UIProgressView *progressBar; IBOutlet UILabel *statusMsg; } @end #import "MyCustomView.h" @implementation MyCustomView - (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Initialization code } return self; } - (void)dealloc { [super dealloc]; } @end 

En IB, establezco el propietario del file y ve la identidad en MyCustomView y conecto el IBOutlet al propietario del file

En MyViewController.m, tengo:

 - (void)viewDidLoad { [super viewDidLoad]; UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame]; [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]]; [myTableView addSubview:subView]; [subView release]; } 

Cuando ejecuto la aplicación, se agrega la vista, pero no puedo ver la label, la barra de progreso y el indicador de actividad.

¿Qué estoy haciendo mal?

-loadNibNamed cargarlo usando el método -loadNibNamed . -initWithNibName es solo para UIViewControllers.

Agregue el siguiente código a su método de inicio MyCustomView:

 NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]; UIView *mainView = [subviewArray objectAtIndex:0]; [self addSubview:mainView]; 

Recuerde, si está inicializando un object desde una punta, llama - (id)initWithCoder:(NSCoder *)aDecoder para inicializar, por lo que tendrá que anularlo si está creando el object MyCustomView dentro de la punta. Si solo lo hace con initWithFrame: simplemente anule eso y agregue el código anterior. Además, en su plumín, asegúrese de tener una UIView de nivel superior y coloque todos los demás elementos dentro de ella (esto garantiza que su subviewArray solo tenga una input).

Esto cargará las vistas desde la punta y las agregará al object, y debería hacer el truco.

Creo que necesitas usar este método:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 

Esto se debe a que debe pasar el nombre de file .xib en el "nibNameOrNil".

Como dijo Hocker, debes usar ese método para pasar el nombre XIB (sin la extensión).

Entonces debes controlar esta list:

  • Abra el file .xib en IB
  • Haga clic en Propietario de file y select la class correcta (MyCustomView en su caso)
  • Mantenga presionado el control y arrastre desde el propietario del file a la vista (ahora el punto de venta de la vista está bien)

Espero que funcione. Aclamaciones.