У меня есть несколько 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];
...
}
Спасибо заранее к удивительному человеку, который может помочь мне.
Согласен. Его код создает экземпляр одной ячейки из nib в viewDidLoad, но затем потенциально возвращает один и тот же экземпляр ячейки несколько раз для разных строк. Вот почему ячейки исчезают - табличное представление перемещает одну и ту же ячейку из одной строки в другую. – TomSwift
На самом деле ProfileTableViewCell.xib содержит 6 различных UITableViewCells с различными идентификаторами повторного использования, и я вызываю соответствующий, используя cell = [tableViewCells objectAtIndex: cellId]; где cellId будет номером индекса объекта в XIB. Я думал, что могу сэкономить некоторые накладные расходы, загрузив один xib, содержащий все ячейки, которые мне нужны, чтобы загрузить 6 разных XIB. Теперь, когда я понимаю, что это что-то нестандартное, я могу попробовать другой подход. Нестандартная логика всегда имеет сбои. –
@JihoKang, Самый простой способ - сделать это в раскадровке. Вы можете сделать все 6 ячеек в одном представлении таблицы. – rdelmar