Я хочу знать, разрешено ли использовать Multiple UItableView
в том же представлении (я не вижу ничего в Руководства по человеческому интерфейсу Apple), и если это нормально, как загружать разные DataSource
в viewDidLoad
для каждого UItableView
?
Два UITableView в одном представлении
Ответ 1
У вас может быть несколько видов таблиц. Вы хотите, чтобы вы указали указатель на каждый из них, а затем в своих методах источника данных вы сделали бы что-то вроде этого:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if(tableView == tableViewOne)
return 5;
else //if (tableView == tableViewTwo)
return 3;
}
Это будет одинаково для всех методов создания делегатов/источников данных, поэтому они дают вам представление таблицы в качестве параметра.
Ответ 2
Да, вы можете. Проблема в том, что каждый UITableView
будет использовать те же UITableViewDataSource
и UITableViewDelegate
. Поэтому вы должны определить, с каким табличным представлением вы работаете в каждом из необходимых методов делегирования.
Например:
- (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;
}
}
Ответ 3
IMO самым чистым решением будет иметь один контроллер для каждого вида таблицы.
Если вы используете один контроллер для n tableview, вам придется использовать if-statemenst во многих местах, в
-
– numberOfSectionsInTableView:
-
– tableView:numberOfRowsInSection:
-
– tableView:titleForHeaderInSection:
- ...
В основном во всех методах UITableViewDatasource-Protocol, которые вам необходимо реализовать.
Итак, если вам нужно что-то изменить, вы должны изменить его во многих местах.
Если вы используете один класс контроллера для одного вида таблицы, вам не нужно будет вообще проверять.
- написать класс контроллера для каждого вида таблицы, сделать его соответствующим протоколу
UITableViewDatasource
- реализовать методы протокола, которые вам понадобятся. как минимум
-
– numberOfSectionsInTableView:
, -
– tableView:numberOfRowsInSection:
, -
– tableView:cellForRowAtIndexPath:
-
- реализовать методы протокола, которые вам понадобятся. как минимум
- вызов
-setDataSource:
для каждого вида таблицы для объекта класса правого контроллера
Я написал пример кода: 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;
}
Ответ 4
Вы можете установить тег для каждой таблицы. Затем примените это условие к методу делегата tableview, например:
myTable.tag=12;
Ответ 5
Чтобы облегчить жизнь, вы можете передать в UITableView два разных делегата. Если вы передадите один и тот же делегат, вам придется делать много утверждений if. Создав два разных делегата, он позволит вашему коду быть намного чище.
Ответ 6
В одном представлении можно просматривать несколько таблиц. Добавьте теги в каждое представление таблицы и с помощью tableview.tag вы можете отдельно загружать данные в таблицы.
Пример:
- (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;
}