2013-08-13 2 views
2

У меня есть несколько UITableViewCells, которые я загружаю из XIB-файла. Все отлично, пока я не вызову метод [UITableView reloadRowsAtIndexPaths: withRowAnimation:], когда ячейка исчезнет. Когда я вызываю [UITableView reloadData], все нагрузки находят, когда я просматриваю ячейку на экране и за ее пределами, она также снова появляется. Weird.Исчезновение UITableViewCell на UITableView reloadRowsAtIndexPaths:

Я также заметил, что когда я вызываю [UITableView reloadRowsAtIndexPaths: withRowAnimation:], UITableView не будет пытаться повторно использовать кэшированную ячейку и попытается получить новую с ячейкой = [tableViewCells objectAtIndex: cellId];

Вот мой код:

- (void)viewDidLoad 
{ 
    ... 
    // the objects from the XIB files are loaded onto an NSArray instance variable at viewDidLoad 
    tableViewCells = [[NSBundle mainBundle] loadNibNamed:@"ProfileTableViewCell" owner:nil options:nil]; 
    ... 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int cellId = /* some logic to get the correct cellID */ 
    NSString *CellIdentifier = [NSString stringWithFormat:@"ProfileTableViewCell_%d", cellId]; 
    ProfileTableViewCell *cell = (ProfileTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
    { 
     cell = [tableViewCells objectAtIndex:cellId]; 
     // additional work to setup subviews for the cell 
     [cell prepareSubviews]; 
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    } 
} 

и только в случае, здесь некоторые вещи я делаю в [ProfileTableViewCell prepareSubviews]

- (void)prepareSubviews 
{ 
    ... 
    [self.containerView.layer setCornerRadius:3]; 
    [self.containerView.layer setBorderColor:UIColorFromRGB(0xCDCDCD).CGColor]; 
    [self.containerView.layer setBorderWidth:2.0]; 
    [self.containerView.layer setMasksToBounds:YES]; 
    [self.containerView.layer setShouldRasterize:NO]; 
    [self.containerView.layer setRasterizationScale:[UIScreen mainScreen].scale]; 
    ... 
} 

Спасибо заранее к удивительному человеку, который может помочь мне.

ответ

1

Я не уверен, что это ваша проблема, но способ, которым вы получаете свои камеры, не является нормальным способом. Вы должны сделать каждый тип ячейки в своем собственном nib (с уникальным идентификатором), а затем зарегистрировать nibs с registerNib: forCellReuseIdentifier :. В cellForRowAtIndexPath просто удалите ячейку, которая вам нужна, на основе пути указателя, и не помещайте ничего в предложение if (cell == nil), потому что это не будет вызываться, когда вы это сделаете.

+0

Согласен. Его код создает экземпляр одной ячейки из nib в viewDidLoad, но затем потенциально возвращает один и тот же экземпляр ячейки несколько раз для разных строк. Вот почему ячейки исчезают - табличное представление перемещает одну и ту же ячейку из одной строки в другую. – TomSwift

+0

На самом деле ProfileTableViewCell.xib содержит 6 различных UITableViewCells с различными идентификаторами повторного использования, и я вызываю соответствующий, используя cell = [tableViewCells objectAtIndex: cellId]; где cellId будет номером индекса объекта в XIB. Я думал, что могу сэкономить некоторые накладные расходы, загрузив один xib, содержащий все ячейки, которые мне нужны, чтобы загрузить 6 разных XIB. Теперь, когда я понимаю, что это что-то нестандартное, я могу попробовать другой подход. Нестандартная логика всегда имеет сбои. –

+0

@JihoKang, Самый простой способ - сделать это в раскадровке. Вы можете сделать все 6 ячеек в одном представлении таблицы. – rdelmar

0

Это означает, что reloadRowsAtIndexPaths: не работает, когда вам нужно только изменить высоту для статической ячейки.

Try назвать только

[tableView beginUpdates]; 
[tableView endUpdates]; 

Как говорится в документации:

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

Смежные вопросы