#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, но у меня возникли проблемы с установкой ячеек в их положение. Но ваше решение намного элегантнее.