Один контроллер просмотра для нескольких разделов UITabBar

В настоящее время я разрабатываю простое приложение для iPhone, использующее UITabBar и табличные представления для отображения данных. Панель вкладок содержит 8 разделов, каждый из которых содержит одно и то же представление, но использует разные источники данных, заголовок табличного представления также отличается, но в остальном представления одинаковы.

Я хотел бы использовать один и тот же контроллер представления для каждого представления с возможностью установки источника данных и заголовка таблицы вместо написания 8 отдельных контроллеров представления с минимальными различиями. Возможно ли это и, что более важно, как это возможно?

Обновление
У меня это работает в определенной степени, используя код, опубликованный Оле Бегеманном. Однако я понял, что мой первоначальный вопрос перепутал какой-то жаргон. UITableViewDataSource является официальным протоколом и делает слишком много для того, чего я пытаюсь добиться. Мне нужна только логика для настройки таблиц один раз, данные для заполнения табличного представления - единственное, что отличается. То, что я имел в виду под «источником данных», было просто словарем объектов, которые могли использоваться моими функциями UITableView моего контроллера представления.

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];

Как я могу передать этот словарь от делегата к UITableViewController?


person mensch    schedule 26.10.2009    source источник


Ответы (3)


Как Даниэль говорит, вы можете создать столько экземпляров тот же контроллер представления, который вам нравится, а затем назначьте эти экземпляры вкладкам вашего контроллера панели вкладок.

Код может выглядеть так (здесь я создаю только 3 экземпляра):

// 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];
person Ole Begemann    schedule 27.10.2009
comment
Здорово! Это именно то, что я искал. Спасибо. - person mensch; 29.10.2009

Конечно, это возможно, для одного вы можете создавать экземпляр контроллера представления столько раз, сколько ud, как с разными источниками данных... Вы будете следовать той же процедуре, что и если бы у вас были разные контроллеры представления для каждой вкладки...

person Daniel    schedule 26.10.2009
comment
Спасибо за ответ. Не могли бы вы подробнее рассказать о том, как это можно реализовать на практике. Пример кода был бы отличным. - person mensch; 26.10.2009

Вы можете использовать UIToolBar с любыми кнопками и вызывать reloadData при каждом нажатии кнопки с разными параметрами.

person Morion    schedule 26.10.2009
comment
Будет ли это работать и с UITabBarItem? Я не уверен, что элемент панели вкладок имеет этот метод. - person mensch; 26.10.2009
comment
Нет, вместо этого вы должны использовать UIBarButtonItem. Вы можете установить цель и действие для каждого элемента. - person Morion; 27.10.2009