2012-01-12 8 views
7

Antecedentes¿Usar múltiples archivos de punta con un solo controlador de vista?

estoy usando constructor de interfaces para crear la interfaz de usuario de una aplicación que estoy trabajando. La aplicación tiene una sola pantalla que muestra una serie de botones. Al hacer clic en un botón aparece una vista asociada que se superpone a los botones. Al hacer clic en otro botón, se oculta la vista de superposición anterior y se muestra otra.

Demasiado fácil para la administración de la IU en IB Decidí crear múltiples archivos de punta para cada subvista que aparece al hacer clic en el botón correspondiente. Luego estoy cargando el archivo de punta de la subvista en el método viewDidLoad del controlador de vista usando la clase UINib.

La idea detrás de esto era evitar tener varias vistas apiladas una encima de la otra en un solo archivo de punta, ya que sería difícil de manipular en IB. Pude haber creado todas las vistas en código, pero esto requeriría mucha codificación tediosa ya que los diseños de cada subvista son bastante complejos (con varias vistas secundarias).

Código de ejemplo cargando una subvista desde un archivo de punta.

- (void)viewDidLoad 
{ 
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil]; 
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil]; 

    // get root view from bundle array 
    UIView *aSubView = [bundleObjects objectAtIndex:0]; 
    [self.view addSubview:aSubView]; 
... 

El código anterior se repite para las otras vistas.

Para resumir, tengo una aplicación de iPhone de una sola pantalla que tiene vistas en capas que se muestran/ocultan al hacer clic en los botones. Esto se logra con un único controlador de vista con un archivo de punta asociado y una serie de archivos de punta adicionales para las subvistas que se cargan en el método viewDidLoad del controlador de vista.

¡Preguntas!

Perdón por la larga presentación pero quería dejar bien en claro qué es lo que estoy haciendo.

  • ¿Mi enfoque es malo o inusual?
  • ¿Hay algún problema potencial para hacerlo de esta manera?
  • ¿Qué han hecho otras personas cuando necesitan una interfaz dinámica y todavía quieren mantener todo en Interface Builder?

Notas

Antes de que alguien le pregunta por qué no me acaba de mostrar los puntos de vista sub en una nueva pantalla y utilice la barra de navegación, quiero decir que tengo muy buenas razones y yo entiendo iOS Directrices de UI. El caso de uso anterior no es exactamente mi caso de uso, pero es uno que describe claramente el problema sin atascarse en mi aplicación de desarrollo.

También sé que podría haber escrito todas las vistas secundarias como código, pero cada subvista tiene un diseño complejo de vistas secundarias y sería un montón de código y de solución intentar que se vean bien.

Gracias de antemano.

Respuesta

1

No existe necesariamente una relación 1-a-1 entre los controladores de vista y las vistas. La mayoría de las vistas contienen muchas subvistas, que son vistas en sí mismas, por lo que esto literalmente no tiene sentido.

Sin embargo, dependiendo de la complejidad de las vistas (incluido su contenido), es posible que desee controladores de vista separados ... o no.

Por ejemplo, si tiene dos sbuviews que son cada tableViews, es posible que desee tener un controlador de vista para cada tableView. Esto se debe a que cada vista de tabla está mirando los mismos métodos de delegado, y si están en el mismo control de vista, entonces los métodos de delegado tienen que diferenciar entre los tableViews. Los métodos de delegado tienen firmas que lo permiten, pero, según mi experiencia, realmente pueden generar un código desordenado que es difícil de seguir y difícil de administrar.

Por otro lado, puede tener dos tablas gestionadas por el mismo viewController, donde una tabla está llena de datos significativos y la otra simplemente es un marcador de posición (como cuando la fuente de datos está vacía). Uno podría ser visible mientras que el otro no. ¿Por qué complicarle la vida creando dos controladores de visualización cuando ambos son manejados por la misma fuente de datos (el modelo)?

En mi opinión, se trata de lo difícil que es seguir y administrar el código. Si la complejidad de usar un solo controlador de vista se vuelve engorrosa, considere usar más controladores de visualización.

ACTUALIZACIÓN

Por cierto, tengo un ejemplo que estoy trabajando actualmente con la que pueden ilustrar una situación similar. En InAppSettingsKit, que muchos desarrolladores usan, hay varios archivos xib para partes de la vista principal. You can look at the structure here on github. Hay una vista principal de controladores y varios archivos xib. (También existe lo que yo llamaría un controlador de vista "auxiliar" y un controlador de vista de compositor de correo electrónico.) En este ejemplo, los archivos xib pueden usarse varias veces para especificar el diseño de las celdas de la vista de tabla. Sin embargo, no hay controlador de vista para cada archivo xib. (La documentación de InAppSettingsKit es escasa, por lo que estas cosas pueden no ser obvias con solo echarle un vistazo rápido).

+0

Entonces, para mi caso de uso, donde la única razón por la que dividí las vistas en archivos nib separados fue para facilitar la administración de esas vistas en IB, ¿cree que mi enfoque es seguro o rompe las directrices de Apple? – Camsoft

+0

No existe una regla o directriz con respecto a lo que está haciendo. Estás bien en ese sentido. – Jim

+0

Agregué un ejemplo de un componente de software real que usan muchos desarrolladores. Ver mi respuesta más arriba para más detalles. – Jim

1

Cada vista debe tener un UIViewController correspondiente. El uso de un ViewController para "controlar" más de una vista rompe el paradigma de MVC. "Controlar" múltiples "vistas" desde un controlador hará que sea mucho más difícil cambiar una cosa sin romper algo más.Las elecciones que realice sobre cómo presentar el contenido al usuario final serán diferentes para cada individuo. Entonces, si dices que un NavigationController no funcionará en tu caso, tal vez una vista modal sea la respuesta o, puedes simplemente crear una instancia de tus UIViewControllers personalizados y agregarlos a tu vista ([addSubview:]), si ese es el camino que deseas, pero como dije, sería beneficioso para ti hacer un "controlador" para cada objeto de vista junto con el xib correspondiente. Si necesita que se le devuelva información, use un delegado o use Notificaciones para enviar el mensaje a la vista principal. Aprendí por las malas que no seguir el paradigma de MVC te hará la vida imposible. Intenta mantener el código lo más desacoplado posible. Y lea sobre el patrón de diseño de MVC, no se arrepentirá.

+0

Todas las vistas sub están relacionados con la pantalla única y por lo tanto un solo controlador de vista.Podría haber agregado fácilmente todas las vistas secundarias en el mismo archivo de punta, pero como dije, el diseño se estaba volviendo complicado y difícil ya que las vistas se superponen. Mi idea era dividir algunas vistas en archivos nib separados y luego cargarlos nuevamente en la vista principal usando el método viewDidLoad del controlador de vista. – Camsoft

+0

Todas las vistas deben tener un UIViewController correspondiente. El uso de un ViewController para "controlar" más de una vista rompe el paradigma de MVC. si esto era cierto, ¿cómo funciona el controlador de vista universal ?, tiene 2 plumillas. – Juan

+0

Estaba pensando casi lo mismo @Hubert. Parece que hay algunos problemas asociados con esto. Si la decisión se toma en tiempo de ejecución, y al hacer clic en un botón, ¿no significa que el xib se cargará en segundo plano, de hecho todos ellos y se seleccionará uno? Además, el autolayout podría haber resuelto el problema fácilmente. –

0

En realidad es posible hacer esto.

Abra su archivo .xib, seleccione Propietario de archivo (en marcador de posición) -> "inspector de identidad" (utilidades) -> cambie el nombre de clase a su controlador nombre de clase -> presione control y arrastre marcador de posición del propietario al objeto Ver, seleccione " ver "en diálogo. Ahora puede personalizar su vista.

p.s. puede usar las mismas salidas que la primera xib, solo necesita arrastrarlas a la nueva xib (+ control seguro).

aquí es un tutorial explicado: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

publicar enlaces en SO podría ser bueno, pero los enlaces tienden a perderse ... por favor, publique los elementos críticos de su respuesta en el cuerpo de la respuesta. – NirMH

+0

@NirMH editado. gracias por los comentarios, es mi primera respuesta en SO – user3206558

Cuestiones relacionadas