我会尽力解释这一点,并希望有人能够理解正在发生的事情:
我正在使用核心数据将数据加载到UITableView中。我试图在TableView的末尾添加一个“最后一个单元格”来显示徽标。这是我的代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
numberOfRows = section;
return [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]+1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ReminderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cellBackground.png"]];
row = indexPath.row;
if (row == [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]) {
NSLog(@"%u",[[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]);
cell.productLabel.text = nil;
cell.companyLabel.text = nil;
cell.dateLabel.text = nil;
cell.accessoryType = UITableViewCellAccessoryNone;
cell.logo.hidden = NO;
cell.renewLabel = nil;
}
else {
Reminder *reminder = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.productLabel.text = reminder.product;
cell.companyLabel.text = reminder.company;
cell.dateLabel.text = reminder.date;
cell.logo.hidden = YES;
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
row = [indexPath row];
if (row == [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]) {
return 50;
}
return 78;
}
正如你所知道的那样,我告诉最后一个单元格没有附件类型,而所有其他单元格都有一个。
正常细胞w /附件箭头:
最后一个单元格:
一切都很美妙,直到我向下滚动到最后一个单元格的底部,然后向上滚动。配件箭头在一些应该有它的表格单元格中消失! (但不是全部)
相同的细胞,但箭已消失:
这里发生了什么?
答案 0 :(得分:2)
这是因为排队机制。 tableView从其缓存中取消任意单元格。如果这些单元格恰好是您之前设置的单元格之一:
cell.accessoryType = UITableViewCellAccessoryNone;
它没有附件指示器。解决这个问题的最简单方法(在我看来,当然你也可以使用不同的重用标识符)就是修改你的代码:
else {
Reminder *reminder = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.productLabel.text = reminder.product;
cell.companyLabel.text = reminder.company;
cell.dateLabel.text = reminder.date;
cell.logo.hidden = YES;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
答案 1 :(得分:1)
问题是dequeReusableCellWithIdentifier:
的调用,因为所有单元格都具有相同的标识符。这意味着当“最后一个单元格”出现然后滚动时,它是可重复使用单元格的下一个提示,并且因为所有单元格都具有相同的标识符,所以每当其中一个单元格从屏幕上掉落时,下一个一个人将没有配件。您需要提出一个实现,为“最后一个单元格”提供不同的标识符。
答案 2 :(得分:1)
我会这样做,定义两个CellIdentifier,一个用于普通单元格,一个用于最后一个单元格:
static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifierBottom = @"CellBottom";
如果建设,请创建你的单元格:
if (row != lastTableViewIndex) {
//create cell with CellIdentifier
} else {
//create cell with CellIdentifierBottom
}
答案 3 :(得分:0)
您可以尝试使用下面的UITableViewDelegate回调功能在显示单元格后自定义您的单元格:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row != (yourDataSource.count-1) {
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
}