Возвращать несколько подклассов UITableViewCell из cellForRowAtIndexPath? - PullRequest
3 голосов
/ 19 июля 2011

Я хочу вернуть несколько пользовательских UITableViewCells в зависимости от типа объекта, который я получаю из моего savedGames массива, хранящегося в моем dataModel. Мой вопрос в том, правильно ли я иду? Я не делал этого раньше и просто хотел убедиться, что я на правильном пути и не пропустил что-то очевидное.

Примечание: новые ячейки размещаются и инициируются в других местах, поэтому в приведенном ниже коде это не показано.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    SharedDataModel *dataModel = [SharedDataModel sharedInstance];
    id genericGameAtRow = [[dataModel savedGames] objectAtIndex:row];

    if([genericGameAtRow isMemberOfClass:[GameZoneOne class]]) {
        CellZoneOne *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONEONE_ID"];
        return cell;
    }

    if([genericGameAtRow isMemberOfClass:[GameZoneTwo class]]) {
        CellZoneTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONETWO_ID"];
        return cell;
    }
    return nil;
}

РЕДАКТИРОВАТЬ: Быстрый вопрос возвращает ноль в нижней части полезно, я знаю, что это позволяет избежать метода, не имеющего возвращаемого значения, но если ни один из "если" сработает, вы получите "Должен вернуть ячейку "ошибка. Очевидно, что важно охватить все возможные варианты, но не лучше ли будет окончательное возвращение вместо стандартного (ванильного) UITableViewCell? ... просто любопытно.

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Да, это правильное решение.

Лично я бы держался подальше от -[id<NSObject> isKindOfClass:], так как это обычно признак плохой архитектуры.Вместо этого я бы добавил свойство gameZone ко всем возможным классам в массиве savedGames.И явно попросил указать его зону / тип.

1 голос
/ 19 июля 2011

Код, который вы показываете, в порядке и правильный путь.

0 голосов
/ 06 июля 2015

Я совершенно новичок в этом вопросе, поэтому могу ошибаться, но не лучше ли, чтобы каждый элемент в вашем массиве, использованный для построения uitableview, имел свое собственное свойство для построения ячейки?

Так что вы могли бы сделать что-то вроде

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
int row = [indexPath row];
[_myArray[row] formatCellAndSetData];

или, может быть, даже

return [_myArray[row] buildCell];

Каждый из ваших пользовательских классов uitableviewcell будет иметь один и тот же метод formatAndSetData, но каждый может реализовать его по-своему. Таким образом, нет зависимости от:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

как зависимость вводится из вашего пользовательского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...