UITableViewCell, две ячейки получают дополнительное представление - PullRequest
4 голосов
/ 12 сентября 2011

Ситуация: когда пользователь выбирает ячейку, в эту ячейку добавляется кнопка. Когда они выбирают новую ячейку, кнопка удаляется из предыдущей ячейки и добавляется в новую ячейку. Это работает. Проблема в том, что в таблицу добавляется больше данных. Допустим, есть 20 ячеек, затем я добавляю еще 20 ячеек. Затем я выбираю первую ячейку, однако кнопка добавляется в ячейку 1 И ячейку 21. Однако метод выбора делегата регистрирует только первую выбранную ячейку.

Из моего метода didSelectRowAtIndexPath:

if (self.selectedCell) {
    self.selectedCell.accessoryView = nil;
    self.selectedCell = nil;
}

UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton setFrame:CGRectMake(0, 0, 130, 34)];

self.selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];

self.selectedCell.accessoryView = downloadButton;
[self.selectedCell setNeedsDisplay];

В моем методе это добавляет больше данных в таблицу, которую я заканчиваю:

if(self.selectedCell){
    self.selectedCell.accessoryView = nil;
    self.selectedCell = nil;
}

[self.tableView reloadData];
[self.tableView setNeedsLayout];

1 Ответ

5 голосов
/ 12 сентября 2011

Клетки используются повторно.В вашем cellForRowAtIndexPath: вы забыли очистить accessoryView.Когда ячейка используется повторно, появляется accessoryView.

Мне нравится техника, устанавливающая accessoryView в tableView:willDisplayCell:forRowAtIndexPath:.Это вызывается прямо перед тем, как ячейка выводится на экран.Затем вы можете сделать что-то вроде:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
  if (cell.isSelected) {
    cell.accessoryView = self.downloadButton; // No reason to create a new one every time, right?
  }
  else {
    cell.accessoryView = nil;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...