Что для подкласса из UITableView

#uitableview #datasource #subclass

#uitableview #источник данных #подкласс

Вопрос:

Допустим, у меня есть 10 просмотров таблиц, для всех из которых фон первой ячейки во всех разделах должен быть красным.

Чтобы не делать это вручную для всех 10 табличных представлений, я думаю, что мне следует подкласс UITableView.

Мой вопрос был бы таков: что я должен перезаписать из UITableView?

Или я должен подкласс UITableViewCell и все ячейки наследуются отсюда?

Спасибо.

Ответ №1:

Вы можете подклассировать UITableViewCell, и тогда вам нужно будет каким-то образом присвоить ячейке раздел и строку, чтобы она знала, что нужно установить фон.

Тем не менее, вы также можете подкласс UITableView. Ниже приведено решение, если вы решите подкласс UITableView, но, в конце концов, это ваше решение.

Единственный способ, который я могу придумать прямо сейчас, — это каким-то образом перехватить все запросы к источнику данных TableView, чтобы затем вы могли манипулировать результатами.

Вы можете сделать это так:

  • Подкласс UITableView, давайте назовем его MyUITableView следующим образом:
  • Добавьте переменную-член id<UITableViewDataSource> myDataSource , а также свойство для этой переменной с установленным для нее IBOutlet. Затем в построителе интерфейса вы должны подключить табличное представление, используя это свойство вместо стандартного свойства источника данных uitableview.
  • Где-нибудь в init или loadView , напишите self.dataSource = self . Идея состоит в том, чтобы перехватывать все запросы (особенно cellForRowAtIndexPath ), чтобы вы могли манипулировать фактическими результатами.
  • В вашем подклассе реализуйте протокол UITableViewDataSource и просто перенаправляйте все вызовы на объект myDataSource.
  • Единственное исключение находится в cellForRowAtIndexPath реализации, где после получения результата из myDataSource вы можете изменить цвет фона, если выполняется определенное условие. Смотрите пример кода ниже
 



@interface MyUITableView : UITableView  {
    id<UITableViewDataSource> myDataSource;
}


@property (nonatomic, retain) IBOutlet id<UITableViewDataSource> myDataSource;


@end


  
 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get the result from the actual data source
    UITableViewCell* cell = nil;
    if (myDataSource)
        cell = [myDataSource tableView:self cellForRowAtIndexPath:indexPath];

    // If you condition is met, then just modify the cell in some way
    if (indexPath.section == 0 amp;amp; indexPath.row == 0)
        cell.contentView.backgroundColor = [UIColor redColor];

    return cell;
}

 

И это практически все, что вам нужно. Я не знаю, достаточно ли я ясно выразился, но если у вас есть какие-либо вопросы, не стесняйтесь.

Комментарии:

1. Спасибо! Это работает. Отлично сделано. Я пытался перезаписать setDataSource (чтобы перехватить метод cellForRowAtIndexPath) в моем пользовательском TableView, но у меня возникли проблемы с установкой ячеек в их положение. Но ваше решение намного элегантнее.