Pregunta

Actualmente estoy desarrollando una aplicación simple para iPhone usando UITabBar y vistas de tabla para mostrar datos. La barra de pestañas contiene 8 secciones, cada una con la misma vista pero usando una fuente de datos diferente, el título de la vista de tabla también es diferente, pero aparte de eso, las vistas son las mismas.

Me gustaría usar el mismo controlador de vista para cada vista, con opciones para establecer el origen de datos y el título de la tabla, en lugar de escribir 8 controladores de vista separados con diferencias mínimas. ¿Sería posible y, lo que es más importante, cómo sería posible?

Actualizar
Lo tengo funcionando hasta cierto punto, usando el código publicado por Ole Begemann. Sin embargo, me di cuenta de que mi pregunta inicial mezclaba algo de jerga. UITableViewDataSource es un protocolo oficial y hace demasiado por lo que estoy tratando de lograr. Solo necesito la lógica para configurar tablas una vez, los datos para llenar la vista de tabla son lo único diferente. Lo que quise decir con "fuente de datos" era solo un diccionario de objetos que mis funciones UITableView de mi viewcontroller podían utilizar.

NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"1", @"Id", 
                    @"The Name", @"Name", 
                    @"Post", @"Type",
                    @"09-09-2009", @"Meta",
                    @"This is the excerpt, @"Excerpt",
                    @"This is the body text", @"Body",
                    @"icon.jpg", @"Icon", 
                    @"image.jpg", @"Image", nil];

NSArray *array = [[NSArray alloc] initWithObjects:row1, nil];

¿Cómo puedo pasar este diccionario del delegado al UITableViewController?

¿Fue útil?

Solución

Como Daniel dice , puede crear tantos instancias del mismo controlador de vista que desee y luego asigne estas instancias a las pestañas de su controlador de barra de pestañas.

El código podría verse así (aquí solo creo 3 instancias):

// Create an array of dictionaries that holds the configuration for the table view controllers.
// Assuming tableXDatasource are existing objects that conform to the UITableViewDataSource protocol.
NSArray *tableControllersConfig = [NSArray arrayWithObjects:
    [NSDictionary dictionaryWithObjectsAndKeys:table1Datasource, @"datasource", @"Table 1", @"title", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:table2Datasource, @"datasource", @"Table 2", @"title", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:table3Datasource, @"datasource", @"Table 3", @"title", nil],
    nil];

// Create the table view controller instances and store them in an array
NSMutableArray *tableControllers = [NSMutableArray array];
for (NSDictionary *configDict in tableControllersConfig) {
    // Assuming MyTableViewController is our custom table view controller class
    MyTableViewController *controller = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil];
    controller.tableView.delegate = controller;
    controller.tableView.dataSource = [configDict valueForKey:@"datasource"];
    controller.title = [configDict valueForKey:@"title"];
    [tableControllers addObject:controller];
    [controller release];
}

// Assign the array of table view controllers to the tab bar controller
self.tabBarController.viewControllers = [NSArray arrayWithArray:tableControllers];

Otros consejos

Claro que es posible, para uno puede crear una instancia del controlador de vista tantas veces como ud con diferentes fuentes de datos ... Seguiría el mismo procedimiento que si tuviera diferentes controladores de vista para cada pestaña ...

Puede usar UIToolBar con los botones que desee y llamar a reloadData en cada clic de botón con diferentes parámetros.

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