iphone - custom - swift xib
¿Puedes intercambiar el archivo NIB por un UIViewController que ya está en pantalla? (5)
Estoy de acuerdo con Rob, pero si realmente quieres meterse con el intercambio de plumillas (que es malo, ya que puede conducir fácilmente a punteros colgantes y cosas por el estilo), podrías cargar la vista de la nueva plumilla con NSBundle
''s - (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
método de - (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
y haz la vista intercambiándote.
Deberías usar diferentes controladores de vista para diferentes tipos de contenido. Si solo difieren ligeramente, aún puede considerar la creación de una clase base y la subclasificación de las diferentes variaciones.
Por ejemplo:
- Crea un nuevo UIVC usando initWithNibName, usando "nib-v1"
- Muestrelo, por ejemplo, usando [(UINavigationController) nav pushViewController: myVC]
- Cambie el NIB que myVC está usando para "nib-v2"
Hasta donde puedo ver, este es el enfoque "correcto" para el diseño de aplicaciones para muchas aplicaciones, cuando se busca información donde se necesitan dos pantallas de interfaz de usuario ligeramente diferentes para la información que se muestra.
Por ejemplo, la mayoría de sus páginas son texto, pero algunas también tienen una imagen (piense en un lector de RSS, donde algunas entradas de RSS tienen texto + imagen, algunas son solo texto).
He tratado esto anteriormente al tener un archivo NIB con una segunda instancia de UIView, identificada e invisible, que superpuse sobre la primera, y la activé / desactivé dependiendo del contexto, usando el indicador "oculto".
Pero esto es claramente incorrecto, y desperdicia la memoria.
Sin embargo, no puedo ver una forma obvia de "volver a cargar" la vista desde el archivo NIB. Supongo que quiero reproducir de algún modo la magia que initWithNibName hace?
Sospecho que esto es posible, pero estoy seguro de que si lo haces "de la manera incorrecta", la aplicación simplemente se bloqueará horriblemente.
Debería consultar la clase UINib para ver si hace lo que quiere. Le permitirá cargar un archivo de punta y guardarlo en la memoria.
Pero solo para aclarar: ¿quiere modificar el archivo de punta en sí ? ¿O desea modificar el contenido del archivo nib cuando se ha cargado en la memoria?
En mi cabeza, la primera sería bastante difícil (no se puede modificar el archivo original, ya que es parte del paquete de la aplicación ... ¿tal vez lo copie en la carpeta Documentos y escriba su propio codificador / decodificador?) segundo es más fácil, pero no estoy seguro de cuál sería la razón? ¿Por qué no simplemente modifica viewController / view después de que se haya cargado (en awakeFromNib, por ejemplo) y, si desea que esos cambios persistan, guarde esos cambios en el archivo después.
En resumen, no sé exactamente qué es lo que le gustaría hacer, pero las posibilidades parecen altas para mí, podría haber una mejor manera de hacerlo.
Siempre puedes realizar
[[NSBundle mainBundle] loadNibNamed:@"FileName" owner:viewController options:nil]];
pero esto sin duda alguna enredará las cosas , si no está seguro de lo que está haciendo, especialmente si la view
está conectada en ambas puntas
Debe rediseñar su jerarquía de controlador de vista para intercambiar entre dos controladores diferentes que se cargan desde dos archivos Nib diferentes.
Alternativamente, puede hacer que el controlador administre el intercambio de vistas que carga de diferentes archivos que no están relacionados con su nibName
. En ese caso, puede cargarlos de la manera anterior. Y deseará tener sus salidas (a, por ejemplo, subviewOne
y subviewTwo
) conectadas en diferentes plumillas.
Vine buscando una respuesta al mismo problema y terminé resolviéndolo así:
UIViewController* ctrler = [[UIViewController alloc] initWithNibName:@"NewControllerNIB" bundle:nil];
// Replace previous controller with the new one
UINavigationController* nav = self.navigationController;
[nav popViewControllerAnimated:NO];
[nav pushViewController:ctrler animated:NO];
No estoy seguro si es posible desasignar el controlador actual antes de que se ejecute la llamada para presionar al nuevo controlador, pero hasta ahora parece funcionar (hasta que solo rediseño la aplicación con un mejor enfoque)
No debe cambiar el archivo NIB que usa UIViewController. La conexión del NIB al UIViewController debe ser un evento de una sola vez. Las vistas ocultas están bien; ciertamente no están claramente equivocados. También puede agregar elementos de vista mediante programación después de la carga. Si está haciendo mucho de eso, puede omitir el NIB por completo y generar la vista mediante programación en -loadView
. Cualquiera de estos está bien, pero no cambie el NIB después de la inicialización. Ni siquiera recomiendo tener múltiples NIB que elijas entre una clase determinada de UIViewController; es demasiado confuso En general, cada NIB debe asignarse a una clase dedicada UIViewController con un nombre muy similar (o idéntico).
En una nota relacionada, recomiendo mover el nombre de la NIB al UIViewController, como se describe en una publicación anterior .