#iphone #ipad #uitableview
#iPhone #iPad #uitableview
Вопрос:
В один класс контроллера UIView я добавил 3 UITableView.
UITableView *ChaptersTableView;
UITableView *SubChaptersTableView;
UITableView *SubTopics1TableView;
Теперь в viewDidLoad класса я инициализировал эти TableView и вызвал методы делегата и источника данных для этих табличных представлений.
ChaptersTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
ChaptersTableView.delegate=self;
ChaptersTableView.dataSource=self;
SubChaptersTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
SubChaptersTableView.delegate=self;
SubChaptersTableView.dataSource=self;
SubTopics1TableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
SubTopics1TableView.delegate=self;
SubTopics1TableView.dataSource=self;
Я хочу иметь разное содержимое и высоту для строк разных табличных представлений. Например. TableView1 будет иметь высоту ячейки 20, TableView2 будет иметь высоту ячейки 40, а TableView3 будет иметь высоту ячейки 60.
Итак, как мне настроить эти методы делегирования и источника данных в зависимости от TableView, для которого они вызываются?
Спасибо.
Ответ №1:
Методы делегирования возвращают объект tableview. Следовательно, при создании вы можете помечать табличные представления следующим образом. SubTopics1TableView.tag = 0, SubChaptersTableView.tag = 1
и т.д.
В ваших методах делегирования проверьте тег и настройте tableviews. Например
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableview.tag == 0)
// Customise this tableview
}
Чтобы изменить внешний вид ячейки, вы можете использовать метод делегирования:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Чтобы изменить высоту строки, вы можете использовать:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Комментарии:
1.
tableView:didSelectRowAtIndexPath:
Метод не может помочь вам изменить высоту ячейки!2. Ну да, есть и другие методы, с помощью которых это можно сделать. Просто давал идею.
3. Тогда вы должны привести правильный пример. Ваш ответ явно вводит в заблуждение.
4. «Итак, как мне настроить эти методы делегирования и источника данных в зависимости от TableView, для которого они вызываются?» — В этом случае должна сработать идея с одним методом делегирования.
Ответ №2:
Взгляните на этот код.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
static NSString *cellIden = nil;
UITableViewCell *cell = nil;
if( [mTableView1 isEqual:tableView ])
{
cellIden = @"Cell1";
cell = [tableView dequeueReusableCellWithIdentifier:cellIden];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIden];
}
cell.textLabel.text = [mList objectAtIndex:indexPath.row];
}
if( [mTableView2 isEqual:tableView ])
{
cellIden = @"Cell2";
cell = [tableView dequeueReusableCellWithIdentifier:cellIden];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIden];
}
cell.textLabel.text = [mArray objectAtIndex:indexPath.row];
}
return cell;
}
Ответ №3:
назначьте тег каждой таблице….
-(CGFloat )tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
if(tableView.tag==1)
return 20;
else if(tableView.tag==2)
return 40;
else if(tableView.tag==3)
return 60;
}
Комментарии:
1. Чего вы ожидаете от подобного теста:
tableView==ChaptersTableView
? Экземпляр не может быть равен классу.
Ответ №4:
Чтобы изменить высоту ячейки, вы должны реализовать tableView:heightForRowAtIndexPath:
в классе делегата, а не в источнике данных. Вы можете прикрепить один и тот же делегат ко всем трем таблицам и реализовать этот метод следующим образом:
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
if ([tableView kindOfClass:[ChaptersTableView class]])
return 20;
else if ([tableView kindOfClass:[SubChaptersTableView class]])
return 40;
else if ([tableView kindOfClass:[SubTopics1TableView class]])
return 60;
else return 44;
}
Это решение будет работать, если вы планируете использовать разные таблицы с разными, но уникальными классами. Если вы планируете различать высоту ячейки для двух разных таблиц, которые реализуют один и тот же класс (например, class of tableView1
== class of tableView2
== Class1
), вам следует установить другой флаг в реализации этого класса и проверить значение этого флага.
Дайте мне знать, может ли это помочь