2012-05-18 14 views
28

Tengo un UIView que tendrá que mostrar dos UITableViews, pero nunca se muestran juntos, utilizando un SegementedBar puede alternar uno u otro.2 UITableViews en un UIView

¿Cuál sería la mejor manera de manejar esto? Simplemente cree uno Table View Controller y cambie la fuente de datos, o cree 2 Table View Controllers y simplemente oculte uno cuando el otro esté visible.

Las 2 tablas tendrán un diseño completamente diferente con diferentes celdas personalizadas.

Respuesta

48

Mantendría un delegado de fuente de datos &.

Esto significa que todos los métodos de delegado/origen de datos se vuelven más complicados, PERO significa que puede conservar la relación de uno a uno entre la vista viewController &.

mantener una referencia a cada una de las vistas de tabla

//vc.h 
@property (nonatomic, weak) IBOutlet UITableView* firstTableView; 
@property (nonatomic, weak) IBOutlet UITableView* secondTableView; 

En los métodos de origen de datos/delegación que necesita para tener en cuenta el hecho de que el método tiene que comportarse de manera diferente dependiendo de la vista de tabla está en uso. p.ej.

//vc.m 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    if (tableView == self.firstTableView) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

return cell; 

}

+0

Gracias, sin embargo, tengo las mismas preocupaciones que en la publicación de rishi, podría causar una estructura de código compleja, pero también puede ahorrarme un montón de código doble. –

+0

La ventaja es que no tienes dos controladores, controlando una vista que 'puede' ser un verdadero dolor cuando sale mal ... – Damo

+1

+1 - esta implementación es mucho más fácil de adaptar y sigue los patrones de diseño de Apple para usar UISearchDisplayController. – CaptainRedmuff

4

Ambos enfoques tienen algunos pros y contras, pero personalmente preferiría tener dos controladores separados.

Enfoque 1 - crear un controlador de vista tabla y cambie la fuente de datos

  • Este enfoque ayuda a evitar código adicional y se repite.
  • Con esta gestión de memoria es bueno usar solo un controlador. (Aunque esto no es una gran preocupación hasta entonces, no tendremos muchos datos.)
  • Problema con esto es tener complejidad.

Enfoque 2 - 2 Tabla Vista Controlador

  • Con este enfoque, sin duda tiene código adicional y se repite.
  • Pero con esto es menos complejo.
+1

Tenía las mismas preocupaciones, mientras que el primer enfoque me ahorraría una gran cantidad de código, me preocupa que podría causar una estructura de código compleja. –

+1

@woutr_be - es por eso que dije que preferiría el segundo lugar, ya que quiero evitar la complejidad añadida. – rishi

+0

Gracias, por ahora voy a ir por el primer enfoque, si se vuelve demasiado complejo todavía puedo cambiar. –

0

Uso separada UITableViewControllers y cambiar las vistas. Es menos código, menos complejidad y es la forma en que Apple lo hace con el TabBar.

En cuanto a la complejidad del código, realmente no hay ninguno. Sólo tiene que hacer lo siguiente para cambiar de vista cuando el valor de la UISegmentedControl 's ha cambiado:

UIView *previousSuperview = myViewController1.view.superview; 
myViewController2.view.frame = myViewController1.view.frame; 
[myViewController1.view removeFromSuperview]; 
[previousSuperview addSubview:myViewController2.view]; 

Como alternativa, puede establecer la propiedad de la vista correspondiente hidden.

+0

Sé que esto se ha retrasado un poco, pero me gusta la solución a esta respuesta: mi única pregunta es si los UITableViewControllers independientes aún funcionan como fuente de datos para sus propias vistas de tabla –

+0

@MikeSimz Sí, de manera predeterminada solo hacen eso. Sin embargo, puede usar una fuente de datos común si lo desea configurándola en ambos 'UITableView's. –

6
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    if (tableView.tag == 1) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

etiqueta se podía asignar desde .xib. , por lo que no es necesario tener la variable UITableVeiw en el archivo .h.Dos tabla general .xib necesario

4

En mi aplicación actual, necesita tener 4 UITableView en un solo UIViewController, a la vez que he de mostrar una sola mesa, sobre la base de la ficha seleccionada por el usuario, no tengo Se agregaron cuatro tablas porque, teniendo todas las diferentes celdas y funciones personalizadas, para reducir la complejidad, tomé cuatro.

El principal beneficio de esto es que, cada vez que no necesita llamar al reloadData para actualizar una sola tabla. Solo necesito manejar adecuadamente el show de tabla & ocultar flujo. Y créeme, eso se ve genial. Sin parpadear en absoluto.

En mi caso, estoy creando cuatro tablas solo por código. Y hago un método que me devolverá una tabla basada en una etiqueta que he aprobado.

Guardo cellForRowAtIndexPath lo más pequeño posible dividiendo el código en diferentes funciones.

+0

esto parece interesante. ¿Qué métodos usa/modifica para lograr este efecto? Los ejemplos de código serían geniales. –

+0

@DavidDelMonte, no podría compartir ningún ejemplo con usted. Pero puede crear un método que oculte todas las tablas y solo muestre la tabla en particular que está buscando. En 'cellForRowAtIndexPath', puede diferenciar cada tabla por su etiqueta. – Hemang

+0

Lo tengo trabajando Hemang. Muchas gracias. –