¿Cuándo debo usar init:
y cuándo debo usar initWithNibName:bundle:
al crear un controlador de visualización?¿Cuándo debo inicializar un controlador de vista usando initWithNibName?
Respuesta
-initWithNibName:bundle:
es el inicializador designado para UIViewController. Algo eventualmente debería llamarlo. Dicho esto, ya pesar de los ejemplos de Apple (que favorecen la brevedad sobre la capacidad de mantenimiento en muchos casos), nunca debería llamarse desde fuera del controlador de visualización.
Es frecuente encontrar que código como este:
MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];
me dicen que esto es incorrecto. Pone los detalles de implementación (el nombre del NIB y el hecho de que incluso se usa un NIB) en la persona que llama. Eso rompe la encapsulación. La forma correcta de hacerlo es:
MYViewController *vc = [[MYViewController alloc] init];
Luego, en MYViewController:
- (instancetype)init
{
self = [super initWithNibName:@"Myview" bundle:nil];
if (self != nil)
{
// Further initialization if needed
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
NSAssert(NO, @"Initialize with -init");
return nil;
}
Esto mueve los detalles fundamentales de la aplicación de nuevo en el objeto, y evita que los abonados romper accidentalmente encapsulación. Ahora bien, si cambia el nombre del NIB o pasa a la construcción programática, lo arregla en un lugar (en el controlador de vista) en lugar de en cada lugar en que se usa el controlador de vista.
Si esta es la manera prevista, ¿por qué generar una XCode4 initWithNibName: paquete: stub para cada clase ViewController vacío, pero ningún método init? –
La misma razón por la que las plantillas no han incluido los prefijos de clase, aunque se supone que debes prefijar las clases, y la plantilla crea el nombre más tonto posible para el delegado de tu aplicación, lo cual es un verdadero dolor de cabeza para solucionar. Y IB fuerza una declaración ivar cuando crea propiedades automáticamente, aunque no debe declarar ivars en el nuevo ABI. Las plantillas no son siempre las mejores prácticas. A menudo son el denominador menos común que funciona un poco en la mayoría de los casos, pero en ningún lugar particularmente bien. El código de ejemplo de Apple está mejorando recientemente, pero todavía tiene mucho camino por recorrer. –
Si sigue la convención de nombrar sus plumillas igual que la clase, entonces este código funciona bien: '- (id) init { return [super initWithNibName: NSStringFromClass ([self class]) bundle: nil]; } ' – CharlesA
Use initWithNibName si está ... inicializando con un archivo de punta. Es decir, un archivo que creó utilizando Interface Builder.
Si no está utilizando IB para diseñar sus vistas, puede simplemente usar init.
usando init cuando no hay un archivo nib/xib, p. La interfaz de usuario se crean mediante la codificación
usando initWithNibName, si tenemos un plumín/xib o misma participación controladora en más de 1 semilla/xib
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
que es lo que pienso ..
Si agrega ~ iphone o ~ ipad a sus nombres de plumilla, puede llamar a initWithNibName @ "ViewController" y seleccionará el correcto. – Darxval
que sólo puede call init, siempre que el xib tenga el mismo nombre que la clase del controlador de vista. La encapsulación no es necesaria. Esto ahorra escribir, pero puede no servir claridad.
NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];
- 1. ¿Cuándo debo llamar - [UIViewController initWithNibName: bundle:]?
- 2. Hacer una vista (inicializado desde initWithNibName) cargar toda su subvista
- 3. ¿Cómo debo inicializar jQuery?
- 4. loadNibNamed de initWithNibName VS NSBundle
- 5. Controlador de vista push en la vista del controlador de vista modal
- 6. ¿cómo puedo acceder a la vista de un controlador de vista padre desde un controlador de vista hijo?
- 7. presentes vista modal controlador
- 8. ¿Cómo debo inicializar un boost :: array?
- 9. UIViewController init vs initWithNibName: paquete:
- 10. Diferencia entre initWithNibName e initWithCoder
- 11. ¿Puede un controlador de vista presentado también ser un controlador de vista de presentación?
- 12. 'Intenté mostrar a un controlador de vista que no existe'.
- 13. ¿Cuándo debo usar adornos?
- 14. Vista de red troncal, inicializar y renderizar
- 15. ¿Debo eliminar un controlador de eventos?
- 16. iOS 6 Rotación: presionando un controlador de vista
- 17. Controlador de vista dividida debe ser controlador de vista raíz
- 18. ¿Cuándo debo declarar session_start() ;?
- 19. ¿Cuándo debo usar malloc en C y cuándo no?
- 20. ¿Cuándo debo usar cuaterniones?
- 21. cómo inicializar clase personalizada/objeto dentro del controlador usando Objective-C en el Iphone
- 22. ¿Interface Builder usa el método -init para inicializar los controladores de vista?
- 23. Parámetro que pasa con initWithNibName:
- 24. dismissModalViewControllerAnimated no libera el controlador de vista
- 25. múltiples UIActionSheets en un controlador de vista
- 26. vista de rieles sin un controlador
- 27. UIViewController (init y initWithNibName)
- 28. ¿Cómo destaco el controlador de vista debajo de un controlador de vista presionado?
- 29. ¿Cómo debo inicializar esta matriz multidimensional?
- 30. Método initWithNibName en el guión gráfico
debe cambiar la respuesta seleccionada en esta cuestión – Eric