Да, вы должны поместить его в метод 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;
}
Я точно не знаю, объясняет ли это вашу проблему, но похоже, что это связано с повторным использованием клетки.
РЕДАКТИРОВАТЬ:
Хорошо, вы нашли решение самостоятельно, когда я печатал свой ответ. : О)