objective c - from - Agregar una subvista personalizada(creada en un xib) a la vista de un controlador de vista: ¿Qué estoy haciendo mal?
load view from xib swift 4 (3)
Como dijo Hocker, tienes que usar ese método para pasar el nombre XIB (sin la extensión).
Entonces tienes que controlar esta lista:
- Abra el archivo .xib en IB
- Haga clic en Propietario de archivo y seleccione la clase correcta (MyCustomView en su caso)
- Mantenga presionado el control y arrastre desde el propietario del archivo a la vista (ahora la salida de la vista está bien)
Espero que funcione. Aclamaciones.
Creé una vista en un xib (con un indicador de actividad, una vista de progreso y una etiqueta). Luego creé archivos .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 archivo y veo la identidad en MyCustomView y conecto el IBOutlet al propietario del archivo
En MyViewController.m, he:
- (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, la vista se agrega, pero no puedo ver la etiqueta, la barra de progreso y el indicador de actividad.
¿Qué estoy haciendo mal?
Creo que necesitas usar este método:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
Esto se debe a que necesita pasar el nombre de archivo .xib en "nibNameOrNil".
-loadNibNamed
cargarlo utilizando 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 objeto desde una punta, llama a - (id)initWithCoder:(NSCoder *)aDecoder
para inicializar, por lo que tendrá que anularlo si está creando el objeto MyCustomView dentro de la punta. Si solo lo hace con initWithFrame:
simplemente anule eso y agregue el código anterior. Además, en su plumilla, asegúrese de tener un UIView de nivel superior y coloque todos los demás elementos (eso asegura que su matriz subview tenga solo una entrada).
Esto cargará las vistas desde el plumín y las agregará al objeto, y debería hacer el truco.