Pregunta

Por ejemplo:

  1. Cree un nuevo UIVC usando initWithNibName, usando "nib-v1"
  2. Mostrarlo, p.e.usando [(UINavigationController) nav pushViewController:miVC]
  3. Cambie el NIB que está usando myVC a "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 RSS tienen texto + imagen, otras son solo texto).

He solucionado esto anteriormente teniendo un archivo NIB con una segunda instancia invisible de UIView con nombre que coloqué sobre la primera y la encendí o desactivé según el contexto, usando la bandera "oculta".

Pero esto es claramente incorrecto y desperdicia memoria.

Sin embargo, no veo una forma obvia de "recargar" la vista desde el archivo NIB.Supongo que quiero reproducir de alguna manera la magia que hace initWithNibName.

Sospecho que esto es posible, pero estoy seguro de que si lo haces "de manera incorrecta", la aplicación simplemente fallará horriblemente.

¿Fue útil?

Solución

Estoy de acuerdo con Rob, pero si realmente quiero ensuciar con el canje de (lo cual es malo, ya que puede conducir fácilmente a la referencia colgante y similares), tal vez podría cargar la vista de la nueva mina con el método NSBundle de - (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options plumín y hacer la vista intercambio de sí mismo.

Usted no debe utilizar diferentes controladores de vista de diferentes tipos de contenido. Si sólo difieren ligeramente, todavía se puede considerar la creación de una clase base y la subclasificación de las diferentes variaciones.

Otros consejos

Siempre se puede llevar a cabo

[[NSBundle mainBundle] loadNibNamed:@"FileName" owner:viewController options:nil]];

pero esto, sin duda, realmente complicar las cosas , si no está seguro de lo que estás haciendo, especialmente si view está conectado en esas dos puntas

Usted debe rediseñar su jerarquía controlador de vista de cambiar entre dos controladores diferentes que se cargan a partir de dos archivos nib diferentes.


Como alternativa, puede hacer que el controlador es propietario de intercambio de puntos de vista que se carga desde diferentes archivos que no están relacionados con su nibName. En ese caso, es posible colocarlos de la manera anterior. Y usted va a querer tener sus salidas (para, por ejemplo, subviewOne y subviewTwo) conectados en diferentes puntas.

Se debe comprobar fuera de la clase UINib para ver si hace lo que quiere. Se le permitirá cargar un archivo semilla y mantenerlo en la memoria.

Pero sólo para aclarar: ¿Quieres modificar el archivo semilla ? O quieres modificar el contenido del archivo de punta cuando se ha cargado en la memoria?

De la parte superior de la cabeza, el primero sería bastante difícil (no se puede modificar el archivo original, ya que es parte del paquete de aplicaciones ... tal vez se copia a la carpeta de documentos y escribir su propio codificador / decodificador ?) la segunda es más fácil, pero no estoy seguro de lo que sería la razón? ¿Por qué no acaba de modificar el viewController / vista después de que se haya cargado (en awakeFromNib, por ejemplo) y, si se quiere que esos cambios persisten, guardar esos cambios a presentar después.

En resumen, no sé exactamente lo que le gustaría hacer, pero las posibilidades parecen altos para mí que podría haber una mejor manera de hacerlo.

No debe cambiar qué archivo SEMILLA utiliza un UIViewController. Colocación de la SEMILLA de la UIViewController debe ser un evento de una sola vez. Las vistas ocultas están bien; ciertamente no son claramente erróneas. También puede agregar mediante programación elementos de la vista después de la carga. Si usted está haciendo mucho de eso, puede omitir la SEMILLA del todo y programáticamente construir la vista en -loadView. Cualquiera de ellos están muy bien, pero no active el SEMILLA después de la inicialización. Ni siquiera recomiendo tener múltiples INIs que elija entre una clase UIViewController dado; es demasiado confuso. Generalmente cada SEMILLA debe asignar a una clase UIViewController dedicado con un nombre muy similar (o idéntico).

En una nota relacionada, recomiendo mover el nombre de la punta en el UIViewController, tal como se describe en un anterior publicación .

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 de si es posible que el controlador actual sea desasignado antes de que se ejecute la llamada para enviar el nuevo controlador, pero hasta ahora parece funcionar (hasta que rediseñe la aplicación con un mejor enfoque).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top