iOS initWithNibName para UIView

¿Es posible implementar initWithNubName para una class personalizada que extiende UIView.

Ejemplo:

.marido

@interface UIPullerView : UIView { } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 

.metro

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { NSBundle *bundle = nibBundleOrNil==nil ? [NSBundle mainBundle] : nibBundleOrNil; NSString *nibName = nibNameOrNil==nil ? @"UIPullerView" : nibNameOrNil; if (self == [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]) { NSLog(@"yes, the same class"); } return self; } 

alguna class de controller llama a esto

 UIPullerView *puller = [[UIPullerView alloc] initWithNibName:nil bundle:nil]; 

Este no es un ejemplo práctico porque no establezco el primer object XIB en mí mismo. Si quisiera, haría una reference a la class principal ¿verdad? Entonces, me gustaría agregar un método que lea el file XIB y replique el object de XIB en uno mismo. No quiero usar UIViewController sino UIView para que no se agreguen vistas adicionales a la vista principal.

También sé cómo configurar el XIB:

introduzca la descripción de la imagen aquí

yo lo haría

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { ... self = [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0] return self; } 

¿Pero esto no es cierto?

¿Es eso posible?

Para solucionar el problema de asignarse a uno mismo y perder la reference de la class principal, me pregunto si debería hacerlo de manera similar a como cargar una UITableViewCell desde una NIB:

  [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil]; cell = myTableCell; self.myTableCell = nil; 

y establezca la class que está haciendo esto como el propietario de la NIB.

Por supuesto, si UIPullerView tu UIPullerView en múltiples, diferentes lugares, entonces la última parte se complicará …

Cree un ExampleView.xib

Cree ExampleView.h y ExampleView.m

  @interface ExampleView : UIView @end 

En el Inspector de identidad de ExampleView.xib , configure Custom Class a ExampleView

introduzca la descripción de la imagen aquí

En Example.m , agregue awakeFromNib

 - (void)awakeFromNib { [super awakeFromNib]; // [self whateverInits]; } 

que se ejecutará cada vez que se carga la vista, por ejemplo:

 NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"ExampleView" owner:self options:nil]; ExampleView *exampleView = [objects firstObject]; 

Prueba esto:

 - (instancetype)initWithNib { NSString *nibName = [NSString stringWithUTF8String:object_getClassName(self)]; return [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]; }