2015-12-29 2 views
1

У меня есть табличное представление, которое можно развернуть при выборе ячейки и свернуть при повторном выборе. Когда вы выберете, ячейка должна развернуться и отобразить ярлык, и когда вы выберете ее снова, она скроется и скроет ярлык. Расширение и свертывание отлично работают, но если я прокручиваю табличное представление после расширения ячейки, он ведет себя странно. Как только он выходит из представления и возвращается, ячейка будет иметь увеличенную высоту ячейки, но метка, которая должна отображаться в расширенной ячейке, скрыта. Если я снова выберу ячейку, она обрушится и отобразит метку. Я использую,Высота UITableviewCell не сбрасывается при прокрутке

- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self tableView:t cellForRowAtIndexPath:indexPath]; 
    if([self cellIsSelected:indexPath]) 
     return cell.frame.size.height+35; 
    return cell.frame.size.height; 
} 

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath { 
    // Return whether the cell at the specified index path is selected or not 
    NSNumber *selectedIndex = [self.selectedIndexes objectForKey:indexPath]; 
    return selectedIndex == nil ? FALSE : [selectedIndex boolValue]; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Deselect cell 
    NSLog(@"Select cell:%@",indexPath); 
    [self.tableView deselectRowAtIndexPath:indexPath animated:TRUE]; 

    if([self pickTaskForIndexPath:indexPath].productSpecialMessage){ 
     BOOL isSelected = ![self cellIsSelected:indexPath]; 
     NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected]; 
     [self.selectedIndexes setObject:selectedIndex forKey:indexPath]; 
     PickTaskTableviewCell *cell= [self.tableView cellForRowAtIndexPath:indexPath]; 
     cell.message.hidden=false; 
     cell.messageLabel.text=[self pickTaskForIndexPath:indexPath].productSpecialMessage; 
     cell.messageLabel.lineBreakMode=NSLineBreakByTruncatingTail; 
     cell.messageLabel.numberOfLines=3; 
     if(cell.messageLabel.hidden==true){ 

      cell.messageLabel.hidden = false; 
     } else { 
      cell.messageLabel.hidden = true; 
     } 
     NSLog(@"message:%@",cell.messageLabel.text); 
     [cell layoutIfNeeded]; 
    } 

    self.tableView.rowHeight=UITableViewAutomaticDimension; 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

} 

indexPath добавляется к selectedIndexes на didSelectRowAtIndexPath Пожалуйста, помогите мне

+0

Если проблема с ярлык, пожалуйста, напишите код, который показывает (скрывает) ярлык при выборе (отмена выбора). – danh

+0

добавлен метод didSelectRowAtIndexPath –

ответ

1

Клетки должны быть настроены только в cellForRowAtIndexPath. Когда происходит изменение состояния, которое заставляет ячейку выглядеть иначе, просто перезагрузите эту ячейку.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    PickTaskTableviewCell *cell = (PickTaskTableviewCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    // everything else you do to configure the cell goes here, then ... 

    // check the logic here, we want one condition that tells us whether to show the labels 
    if([[self cellIsSelected:indexPath] && self pickTaskForIndexPath:indexPath].productSpecialMessage){ 
     // don't need these here 
     //NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected]; 
     // [self.selectedIndexes setObject:selectedIndex forKey:indexPath]; 
     // PickTaskTableviewCell *cell= [self.tableView cellForRowAtIndexPath:indexPath]; 

     cell.message.hidden=false; 
     cell.messageLabel.text=[self pickTaskForIndexPath:indexPath].productSpecialMessage; 
     cell.messageLabel.lineBreakMode=NSLineBreakByTruncatingTail; 
     cell.messageLabel.numberOfLines=3; 
     cell.messageLabel.hidden=NO; 
    } else { 
     cell.message.hidden=YES; 
     cell.messageLabel.hidden=YES; 
    } 
    NSLog(@"message:%@",cell.messageLabel.text); 
    // don't need this here 
    // [cell layoutIfNeeded]; 
    return cell; 
} 

Выбор (и, предположительно, Отмена) вызывают необходимость обновления ячейки, так что ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // don't deselect it here, just reload it 

    // more on this later... 
    [self.selectedIndexes setObject:selectedIndex forKey:indexPath]; 
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

// probably do the same in didDeselectRowAtIndexPath: 

И последнее (по желанию) точки. Там нет необходимости поддерживать свой собственный список выбранных путей индекса, UITableView делает это для вас, чтобы вы могли удалить selectedIndexes свойства и просто использовать методы представления таблицы, например ...

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath { 
    // Return whether the cell at the specified index path is selected or not 
    return [[self.tableView indexPathsForSelectedRows] containsObject:indexPath]; 
} 
Смежные вопросы