Soy consciente de que esta pregunta se ha hecho antes, pero las respuestas son contradictorias y estoy confundido, así que no me llames.
Quiero tener una UIView
subclase reutilizable en toda mi aplicación. Quiero describir la interfaz usando un archivo nib.
Ahora digamos que es una vista de indicador de carga con un indicador de actividad. Me gustaría en algún evento crear una instancia de esta vista y animarla en la vista de un controlador de vista. Podría describir la interfaz de la vista sin problemas mediante programación, creando los elementos mediante programación y estableciendo su marco dentro de un método de inicio, etc.
Sin embargo, ¿cómo puedo hacer esto usando una punta? Mantener el tamaño dado en el generador de interfaces sin tener que establecer un marco.
Me las arreglé para hacerlo así, pero estoy seguro de que está mal (es solo una vista con un selector):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Pero me estoy sobrescribiendo a mí mismo, y cuando lo instancia:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Tengo que configurar manualmente el marco en lugar de que lo recojan de IB.
EDITAR: Quiero crear esta vista personalizada en un controlador de vista y tener acceso para controlar los elementos de la vista. No quiero un nuevo controlador de vista.
Gracias
EDITAR: No sé si esta es la mejor práctica, estoy seguro de que no lo es, pero así es como lo hice:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
Todavía se quiere la práctica correcta
¿Debería haberse hecho esto usando un controlador de vista e init con el nombre de nib? ¿Debería haber configurado la punta en algún método de inicialización de UIView en el código? ¿O está bien lo que he hecho?
initWithDataSource
? De todos modos, esto funcionará incluso si le da propietario como 'Nil'.