3

我正在制作一个简单的“添加到收藏夹”功能,它是一个 UITableViewController。当用户选择一个单元格时,我将其设置为color灰色并禁用selectionStyle

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.textLabel.textColor = [UIColor grayColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

我的第一个问题是,每次我选择一个单元格时,其他一些单元格也在切换颜色。所以我删除了以下代码以防止这种情况发生:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

但是我仍然有一个奇怪的问题:在向下滚动 tableview 然后回到它的顶部后,我注意到我选择的所有单元格都恢复了默认颜色,并且最后一个选择的单元格以蓝色突出显示。

所以我可能错了,但我假设滚动时表格视图正在刷新,我想禁用此行为。

在此先感谢您的帮助。

4

3 回答 3

7

您缺少对 UITableView 呈现其子视图 (UITableViewCells) 方式的基本理解。我建议阅读UITableView 编程指南永远不要删除dequeueReusableCellWithIdentifier对表格视图的调用,这对性能非常重要。

对于您的问题:您需要跟踪每个单元格的状态,并在 cellForRowAtIndexPath: 中设置选择状态,UITableView 会尽可能重用单元格,并在单元格在屏幕内外滚动时刷新。

一个非常简单的实现是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (![self.selectedRows containsObject:indexPath])
        [self.selectedRows addObject:indexPath];
    else
        [self.selectedRows removeObject:indexPath];

    [tableView reloadRowsAtIndexPaths:@[indexPath]];
}

并在 cellForRow

if ([self.selectedRows containsObject:indexPath])
{
    cell.textLabel.textColor = [UIColor grayColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
    //set the normal cells values
}
于 2012-09-15T22:33:41.677 回答
2

你不想禁用 UITableViewController 提供的最重要的功能,因为这个删除/创建技巧给你可能想要的快速滚动。

一旦单元格离开屏幕(取决于 tableviewcontroller 行高),它们就会被释放(从内存中删除)。如果它是一个传入单元格(从屏幕外部),它将在 cellForRowAtIndexPath (creation) 方法中相应地创建。

您可能希望使用 aDataSource来创建和保存状态,这样它就不会失去其属性。

或试试这个

UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];
于 2012-09-15T22:33:18.457 回答
2

为了提高效率,表格单元格在单元格滚动离开屏幕时被重复使用。这是正常的和期望的。随它去吧,不要试图打败它。

您需要跟踪在单元格本身以外的其他位置选择的行,因为当它滚动离开屏幕时,这些行会丢失。我建议在您的视图控制器中创建一个属性,例如一个 NSNumbers 数组,它们是 BOOL。当一个单元格被选中时,将 bool 设置为对应于您的行的 true,然后您可以更改单元格的文本颜色。

当一个单元格出列时,您需要根据您的数组设置其颜色。这将确保您的单元格在屏幕上下滚动时具有正确的颜色。

于 2012-09-15T22:35:14.827 回答