Как я могу централизовать cellForRowAtIndexPath? - PullRequest
0 голосов
/ 24 ноября 2011

Я ищу один - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath метод, который все UITableView' s будут использовать для форматирования и т. Д.

Каков наилучший способ сделать это?

Прямо сейчас я думаю, что мог бы использовать отдельный класс или поместить методы делегата в делегат своего приложения и привязать к нему владельца файла UITableView. Но тогда мне придется предоставить этим классам / методам доступ к данным, которые в противном случае были бы правильными в подклассе ViewController.

Как другие достигли такого рода вещей?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не ищу способ вернуть саму общую ячейку, а скорее способ иметь один метод cellForRowAtIndexPath во всем моем приложении.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

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

+ (UITableViewCell* ) tableViewCellForTableView:(UITableView *)tableView withType:(int)type;

Создавая стоимостные выражения типовкоторые передаются, вы можете создать набор базовых ячеек табличного представления, которые затем могут быть возвращены этим классом.Важно перейти в tableView, чтобы использовать многократно используемые ячейки.cellForRowAtIndexPath теперь может получать оттуда ячейки и настраивать их в зависимости от данных

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [MyCellFactory tableViewCellForTableView:tableView withType:kMyTypePlain];

    cell.textLabel.text = ....;
}
.
0 голосов
/ 24 ноября 2011

Я думаю, вы можете использовать ответ от @TriPhoenix для большей части этого.

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

[MyCellFactory cellForTableView:tableView withType:kMyTypePlain data:data];

Вы, конечно, должны убедиться, что data реагирует на общий интерфейс, чтобы гарантировать, что вы можете легко все настроить, например. убедившись, что каждый объект реагирует на похожий метод, такой как

cell.textLabel.text = data.textLabelText; 

Вы можете сделать это, используя протокол, если хотите. Вам решать, как вы структурируете свои данные.

0 голосов
/ 24 ноября 2011

Вы можете рассмотреть возможность использования Objective-C категории на вашем ViewController, который реализует метод cellForRowAtIndexPath.

Однако если вы делаете что-то очень сложное в этом методе, я предлагаювы просто создаете файл пера, который содержит вашу ячейку, а затем загружаете его в cellFoRowAtIndexPath.Вы даже можете создать класс, который наследует от UITableViewCell и вставить туда свои собственные методы / свойства.Я настоятельно рекомендую этот подход.

Вы можете загрузить перо, скажем «MyCustomTableCell.nib», которое содержит ваш настроенный UITableViewCell, например, так:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" 
                                                         owner:self
                                                       options:nil];
MyCustomTableCell* cell = [topLevelObjects objectAtIndex:0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...