Странное поведение UITableViewCell

#ios #objective-c #uitableview

#iOS #objective-c #uitableview

Вопрос:

Здравствуйте, я недавно столкнулся с проблемой в UITableViewCell

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ContentCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    CloseButton *cButton = (CloseButton *)[cell viewWithTag:20];
    [cButton addTarget:self action:@selector(deleteDetector:) forControlEvents:UIControlEventTouchUpInside];
     ...
return cell;
}
  

Позже, на моем детекторе удаления:

 -(void)deleteDetector:(id)sender {
    CloseButton *cButton = (CloseButton *)sender;

    [cButton setHidden:YES];
}
  

Когда я начинаю прокручивать вниз примерно до 1000 ячеек, начинают появляться кнопки, и некоторые из них начинают исчезать.

Ответ №1:

Итак, если я правильно понял ваш вопрос, я предполагаю, что происходит:

Вы нажимаете кнопку в ячейке, что делает кнопку скрытой. Затем вы прокручиваете дальше вниз, и появляется другая ячейка с уже скрытой кнопкой (даже если вы еще не нажали кнопку для этой строки).

Это связано с тем, что ваши ячейки фактически используются повторно, а это означает, что когда одна из ячеек, в которой уже скрыта кнопка, используется повторно, эта кнопка все равно будет скрыта (поскольку это фактически та же ячейка). «Быстрое решение», чтобы доказать это, — отобразить кнопку в вашем tableView:cellForRowAtIndexPath: методе, например:

 [cButton setHidden:NO];
  

Сделайте это где-нибудь после этого, очевидно:

 CloseButton *cButton = (CloseButton *)[cell viewWithTag:20];
  

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