Использование альтернативного accessoryType в UITableViewCell - PullRequest
1 голос
/ 29 августа 2010

В основном я хочу показать UITableViewCellAccessoryDisclosureIndicator в зависимости от определенных ситуаций, в данном случае, когда в моих данных строки есть URL (на который я ссылаюсь через indexPath.row.

У меня есть правильный код, чтобы понять, чтоout (то есть, если URL существует), но я не уверен, где мне следует указывать этот код в методе "cellForRowAtIndexPath:". Я пробовал его в предложении if (cell == nil) и вне его, и оба разаЯчейка перерисовывается иногда с индикатором или без него, когда ячейка возвращается в поле зрения после прокрутки.

Она отлично работает при начальном рисовании.

Какие-либо советы о том, как мне лучше всего этого добиться?

Ответы [ 3 ]

2 голосов
/ 29 августа 2010

Да, вы должны поместить его в метод cellForRowAtIndexPath: делегат, вне оператора if (cell == nil). Поскольку ячейки перерабатываются, вы должны убедиться, что для типа аксессуаров задано правильное значение для каждой ячейки, а не только для тех, которые нуждаются в конкретном типе аксессуаров.

Например:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip {
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CELL"];

    if (cell == nil) {
        cell = [[[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"] autorelease];
    }

    if (ip.row == 3) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}

Этот код не будет работать так, как мы хотим. Поскольку ячейки перерабатываются, ячейка с типом аксессуара, установленным в UITableViewCellAccessoryDisclosureIndicator, будет повторно использована позже в неопределенной строке и затем будет отображать индикатор раскрытия, даже если она не находится в строке № 3.

Чтобы иметь дело с повторным использованием ячеек, мы должны установить тип аксессуара для КАЖДЫХ ячеек, независимо от их ряда:

    if (ip.row == 3) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else {
        cell.accessoryType = UiTableViewCellAccessoryNone;
    }

Я точно не знаю, объясняет ли это вашу проблему, но похоже, что это связано с повторным использованием клетки.

РЕДАКТИРОВАТЬ:

Хорошо, вы нашли решение самостоятельно, когда я печатал свой ответ. : О)

0 голосов
/ 29 августа 2010

Ответ был прост в конце концов. Когда URL-адрес присутствовал, я устанавливал UITableViewCellAccessoryDisclosureIndicator. Чего я не делал, так это устанавливал UITableViewCellAccessoryNone, если не было URL-адреса. Поэтому при перерисовке он запоминал ряд с включенным.

0 голосов
/ 29 августа 2010

Вскоре после того, как вы проверите свое состояние, вы можете установить интересующую вас ячейку по ее indexPath. Тогда, возможно, вы хотите позвонить reloadData.

...