2011-04-21 14 views
16

Quiero saber si está permitido el uso múltiple UItableView en la misma vista (no veo cualquier cosa en el Apple's Human Interface Guidelines) y si está bien, cómo cargar diferentes DataSource en viewDidLoad para cada UITableView?Dos UITableView en la misma vista

+0

Prueba este donde se busque código de ejemplo con plena explicación de 2 enfoques diferentes para hacer esto: Véase mi respuesta en http://stackoverflow.com/a/11789681/846372 – Soniya

Respuesta

5

Sí, puedes. El problema es que cada UITableView usará el mismo UITableViewDataSource y UITableViewDelegate. Por lo tanto, debe determinar con qué tabla de trabajo está trabajando en cada uno de los métodos delegados necesarios.

Por ejemplo:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    // make bigger rows 

    if (tableView == myBigRowTableView) 
    { 
     // make bigger rows 
     return 127; 
    } else if (tableView == mySmallRowTableView) { 
     // make smaller rows 
     return 20; 
    } else { 
     return 30; 
    } 
} 
+2

Simplemente haga Asegúrese de proporcionar un valor predeterminado, ya sea al tener un tipo de devolución predeterminado al final o al hacer que su última cláusula if sea otra cosa, de lo contrario recibirá advertencias del compilador. – Christian

+0

Buen punto. +1 Gracias. – dredful

20

Usted puede sin duda tener múltiples vistas de tabla. Usted quiere asegurarse de que mantener un puntero en torno a cada uno, y luego en sus métodos de fuente de datos, usted haría algo como esto:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    if(tableView == tableViewOne) 
      return 5; 
    else //if (tableView == tableViewTwo) 
      return 3; 
} 

Este sería el mismo para todos los métodos de delegado/fuente de datos, los cuales es por eso que le dan qué tabla de vista como un parámetro.

1

Para hacer la vida más fácil, puede pasar dos delegados diferentes a UITableView. Si pasa al mismo delegado, tendrá que hacer muchas declaraciones if. Al crear dos delegados diferentes, permitirá que su código sea mucho más limpio.

+0

Sin embargo, a menudo no es la mejor práctica, ya que tendría que tener varias clases para hacer esto. El código debe colocarse donde tiene más sentido colocarlo, no donde guardará la escritura del programador. – Christian

+3

@Christian, poner el código en otra clase no guarda la escritura. El código de separación se llama ** Encapsulación **. –

5

IMO la solución más limpia sería tener un controlador para cada vista de tabla.

Si utiliza un controlador para n tableview, tendrá que utilizar si-operadoras en muchos lugares, en

  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection:
  • – tableView:titleForHeaderInSection:
  • ...

Básicamente en todo UITableViewDatasource-Prot métodos de ocol que deberá implementar.

Así que si necesita cambiar algo, tiene que cambiarlo en muchos lugares.

Si utiliza una clase de controlador para una vista de tabla, no tendrá que comprobar en absoluto.

  1. escribir una clase controlador para cada tableview, que sea conforme con el protocolo de UITableViewDatasource
    • poner en práctica los métodos de protocolo que va a necesitar.al menos
      • – numberOfSectionsInTableView:,
      • – tableView:numberOfRowsInSection:,
      • – tableView:cellForRowAtIndexPath:
  2. llamada -setDataSource: para cada tableview a un objeto de la clase del controlador derecho

escribí un ejemplo código: https://github.com/vikingosegundo/my-programming-examples/tree/master/TwoTableViews

TwoTableViewsViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (firstController == nil) { 
     firstController = [[FirstTVContoller alloc] init]; 
    } 
    if (secondController == nil) { 
     secondController = [[SecondTVController alloc] init]; 
    } 
    [firstTable setDataSource:firstController]; 
    [secondTable setDataSource:secondController]; 

    [firstTable setDelegate:firstController]; 
    [secondTable setDelegate:secondController]; 
    firstController.view = firstController.tableView; 
    secondController.view = secondController.tableView; 
} 
+0

Gran admirador de este método. Mucho más limpio y más organizado. –

+9

No hay necesidad de invocar controladores de vista adicionales y cargar nuevas vistas. Puede crear 2 clases que adopten el y otros protocolos que pueda necesitar para sus tablas. Cree esos delegados como propiedades en su controlador de vista principal. Luego, ya sea en el código o en un archivo XIB, puede asignarlos como delegado y origen de datos respectivos a sus 2 dos tablas. Es similar al enfoque descrito anteriormente, pero no es necesario agregar la complejidad de más controladores y vistas a su jerarquía. – Michael

3

Puede configurar la etiqueta para cada tabla. A continuación, aplicar en esa condición en el método delegado tableview, por ejemplo:

myTable.tag=12; 
1

Puede tener varias vistas de tabla en una sola vista. Agregue etiquetas a cada vista de tabla y con el uso de tableview.tag puede cargar datos en las vistas de tabla por separado.

Ejemplo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    if (tableView.tag == x) { 
     //code to load table view with tag value x 

     } 
     else{ 
     //code to load second table 
     } 
     return cell; 

    } 
Cuestiones relacionadas