Один viewcontroller для нескольких разделов UITabBar
-
06-07-2019 - |
Вопрос
В настоящее время я разрабатываю простое приложение для iPhone, используя UITabBar и табличные представления для отображения данных.Панель вкладок содержит 8 разделов, каждый из которых содержит одно и то же представление, но использует другой источник данных, заголовок табличного представления также отличается, но в остальном представления те же.
Я бы хотел использовать один и тот же viewcontroller для каждого представления с параметрами для установки источника данных и заголовка таблицы, вместо того чтобы писать 8 отдельных viewcontrollers с минимальными различиями.Возможно ли это и, что более важно, как это возможно?
Обновить
У меня это работает в определенной степени, используя код, опубликованный Оле Бегеманном.Однако я понял, что в моем первоначальном вопросе смешался какой-то жаргон.UITableViewDataSource является официальным протоколом и делает слишком много для того, чего я пытаюсь достичь.Мне нужна логика для настройки таблиц только один раз, данные для заполнения табличного представления - это единственное, что отличается.То, что я подразумевал под "источником данных", было просто словарем объектов, которые могли быть использованы моими функциями UITableView моего viewcontroller.
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?
Решение
Как Дэниел говорит, Таким образом, вы можете создать столько экземпляров одного и того же контроллера представления, сколько захотите, а затем назначить эти экземпляры вкладкам вашего контроллера панели вкладок.
Код может выглядеть следующим образом (здесь я создаю только 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];
Другие советы
Конечно, это возможно, например, вы можете создавать экземпляр контроллера представления столько раз, сколько захотите, с разными источниками данных...Вы бы выполнили ту же процедуру, что и если бы у вас были разные контроллеры представления для каждой вкладки...
Вы можете использовать UIToolbar с любыми кнопками, которые вы хотите, и вызывать reloadData при каждом нажатии кнопки с разными параметрами.