0

我将尽我所能解释这一点,并希望有人能理解发生了什么:

我正在使用核心数据将数据加载到 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;

}

正如你所知道的,我告诉最后一个单元格没有附件类型,而所有其他单元格都将有一个。

带辅助箭头的正常细胞: 有配件箭头

最后一个单元格: 最后一个单元格

一切都很好,直到我向下滚动到最后一个单元格所在的底部,然后向上滚动。附属箭头在一些应该有它的表格单元格中消失了!!(但不是全部)

相同的单元格,但箭头消失了: 没有箭头

这里发生了什么?

4

4 回答 4

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;

}
于 2012-10-28T19:28:56.617 回答
1

问题是调用dequeReusableCellWithIdentifier:,因为您的所有单元格都具有相同的标识符。这意味着当“最后一个单元格”出现然后滚动时,它是可重用单元格的下一个提示,并且由于所有单元格都有相同的标识符,每次其中一个从屏幕上掉下来,下一个一个就没有配件了。您需要提出一个实现,为“最后一个单元格”提供不同的标识符。

于 2012-10-28T19:24:52.300 回答
1

我会这样做,定义两个 CellIdentifier,一个用于正常单元,一个用于最后一个单元:

static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifierBottom = @"CellBottom";

如果构造,则创建您的单元格 i:

if (row != lastTableViewIndex) {
    //create cell with CellIdentifier
} else {
    //create cell with CellIdentifierBottom
}
于 2012-10-28T19:25:10.047 回答
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;
    }
}
于 2012-10-28T19:48:24.033 回答