Несколько UITableViews в одном классе

#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 ), вам следует установить другой флаг в реализации этого класса и проверить значение этого флага.

Дайте мне знать, может ли это помочь