Crear UITableview agrupado con diferentes types de celdas

Necesito crear una vista agrupada que incluya algunas secciones y posiblemente diferentes types de celdas en cada sección.

Estoy intentando crear algo así como la antigua aplicación foursquare, página de usuario (incluye 'sorting', 'sugerencias de amigos', 'amigos', 'statistics', 'categorías más exploradas' … secciones).

Soy bastante nuevo en la progtwigción de ios, por lo que esa vista puede no ser una vista adecuada agrupada.

Lo que me pego especialmente es crear diferentes celdas para las secciones, y descubrir qué celdas se hacen clic.

Mi fuente de datos será 2 diferentes NSArray * que consta de diferentes types de datos, por eso necesito diferentes celdas personalizadas.

Dado que tiene dos sets de datos diferentes y necesita mostrar ambos en diferentes secciones, debe dividir los methods de fuente de datos en dos.

Básicamente, elige qué set de datos quieres ser primero y fuera de lugar.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(section)return secondArray.count; //Essentially, if statements evaluate TRUE and move forward if the inside is 1 or greater (TRUE == 1) return firstArray.count; //If the first if statement return hits, then the code will never reach this statement which turns this into a lighter if else statement } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section) { //do stuff with second array and choose cell type x } else { //do stuff with first array and choose cell type y } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Get the cell with: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if(indexPath.section) { //perform action for second dataset } else { //perform action for first dataset } } 

Para los encabezados, puede usar cualquiera de estos methods y simplemente mantener el mismo tipo de estilo que el anterior:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 

Puede crear varias subclasss personalizadas de UITableViewCell, y en el método tableView: cellForRowAtIndexPath: para su UITableViewDataSource, puede usar sentencias if para determinar qué tipo de celda usar.

Por ejemplo, aquí hay un resumen aproximado de lo que podría hacer:

 -(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //First, determine what type of object we're showing if (indexPath.section == 0) { //Create and return this cell. } else if (indexPath.section == 1) { //Create and return this cell. }... } 

A continuación, le indicamos cómo implementaría numberOfRowsInSection :

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == 0) { return [firstSectionArray count]; } else if (section == 1) { return [secondSectionArray count]; } ... } 

Para didSelectRowAtIndexPath

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0) { ObjectSelected *objectSelected = [firstArray objectAtIndex:indexPath.row]; //Now you've got the object, so push a view controller: DetailViewController *dvc = [[DetailViewController alloc] init]; dvc.objectSelected = objectSelected; [self.navigationController pushViewController:dvc]; } else if (indexPath.section == 1) { //Same thing, just call [secondArray objectAtIndex:indexPath.row] instead! } }