iOS - tableview在向下滚动时禁用刷新

时间:2012-09-15 22:01:16

标签: ios uitableview scroll refresh

我正在制作一个简单的“添加到收藏夹”功能,这是一个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然后返回到它的顶部之后,我注意到我选择的所有单元格都恢复为默认颜色,并且选中的最后一个单元格被突出显示蓝色。

所以我可能错了,但我想滚动时桌面视图会刷新,我想禁用此行为。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

您缺少对UITableView呈现其子视图(UITableViewCells)的方式的基本理解。我建议阅读UITableView programming guide从不删除表格视图上的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
}

答案 1 :(得分:2)

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

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

您可能希望使用DataSource来创建和保存状态,因此它不会失去其属性。

或试试这个

UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

答案 2 :(得分:2)

为了提高效率,当单元格从屏幕滚动时,表单元格会被重用。这是正常的和期望的。坚持下去,不要试图打败它。

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

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