Подкласс UITableViewCell (и, возможно, с использованием идентификатора) - PullRequest
2 голосов
/ 28 февраля 2012

Я пытаюсь найти способ не дублировать код при настройке пользовательских ячеек в табличном представлении.В настоящее время у меня есть класс BaseCell, разделенный на подклассы от UITableViewController, а затем два подкласса BaseCell: CellTypeOne и CellTypeTwo.Такую настройку я сейчас использую:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *type = [self.rowTypes objectAtIndex:indexPath.row];

    if ([type isEqualToString:@"Type 1"]) {
        CellTypeOne *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];

        cell.picture.image = // An image
        cell.caption.text = // A caption

        cell.author.text = // An author

        return cell;
    }

    else if {[type isEqualToString:@"Type 2"]) {
        CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];

        cell.picture.image = // An image
        cell.caption.text = // A caption

        cell.number.text = // A number

        return cell;
    }
}

Поскольку некоторые из устанавливаемых свойств одинаковы для каждого типа ячеек, мне интересно, есть ли способ сделать что-то вродеthis:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *type = [self.rowTypes objectAtIndex:indexPath.row];

    id cell;

    if ([type isEqualToString:@"Type 1"]) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];

        // Cast cell to (CellTypeOne *)?

        cell.author.text = // An author
    }

    else if {[type isEqualToString:@"Type 2"]) {
        CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];

        // Cast cell to (CellTypeTwo *)?

        cell.number.text = // A number
    }

    cell.picture.image = // An image
    cell.caption.text = // A caption

    return cell;
}

Таким образом, я могу выполнить специфичную для класса настройку для каждого подкласса, а затем выполнить общую настройку для обоих.Единственный способ заставить это работать, это разыгрывать ячейку каждый раз, когда мне нужно ее использовать, что-то вроде этого:

[(BaseCell *)cell picture].image = // An image

Приведение ячейки в каждой строке кажется более трудоемким, чем парастрок дублированного кода для начала, но я просто пытаюсь найти лучший способ сделать это.

1 Ответ

2 голосов
/ 28 февраля 2012

Вы можете сделать переменную cell типа BaseCell*, чтобы избежать бросков вне ifs:

BaseCell *cell;

if ([type isEqualToString:@"Type 1"]) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
    [[cell author] setText:/*an author*/];
} else if {[type isEqualToString:@"Type 2"]) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
    [[cell number] setText: /* a number */];
}

cell.picture.image = // An image
cell.caption.text = // A caption

Кроме того, вы можете оставить тип id и использовать синтаксис вызова метода, а не синтаксис элемента (точки) вне ifs:

id cell;
// ... the code from your post
[[cell picture] setImage: /* an image */];
[[cell caption] setText: /* a caption */];

Наконец, вы можете избежать использования квадратных скобок и , объявив дополнительные переменные внутри ifs:

BaseCell *cell;

if ([type isEqualToString:@"Type 1"]) {
    CallTypeOne *cellOne = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
    cellOne.author.text = // An author
    cell = cellOne;
} else if {[type isEqualToString:@"Type 2"]) {
    CellTypeTwo *cellTwo = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
    cellTwo.number.text = // A number
    cell = cellTwo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...