2012-09-15 64 views
2

我正在做一个简单的“添加到收藏夹”功能,这是一个UITableViewController。当用户选择的单元,I设置灰色color和太禁用selectionStyleiOS - tableview禁用滚动时刷新

- (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中,然后回到它的顶部后,我注意到,所有的细胞我已选择返回到默认颜色,并且选中的最后一个单元以蓝色突出显示。

所以我也许错了,但我假定该滚动时的tableview令人耳目一新,我想禁用此行为。

在此先感谢您的帮助。

回答

5

你缺少的一个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 
} 
+0

此解决方案适用于我,非常感谢! – Yaman

2

你不会希望禁用的最重要功能的UITableViewController提供,因为这删除/创建招让你快速滚动,你可能想要的。

一旦细胞是关闭屏幕(取决于tableviewcontroller行高度),他们得到解除分配(从内存中删除)。如果它是一个传入的单元格(来自屏幕外部),它将在cellForRowAtIndexPath(创建)方法中相应地创建。

您可能需要使用DataSource创造和保存状态,因此它不会失去其性能。

或试试这个

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

为了提高效率,如细胞滚动出屏幕的表格单元被重新使用。这是正常的和想要的。去吧,不要试图击败它。

您需要跟踪已选定比电池本身某处其他行的,因为这将会丢失,当它滚出屏幕。我建议在你的视图控制器中创建一个属性,例如BOOL的NSNumbers数组。当选中单元格时,将bool设置为对应于您的行的true,然后可以更改单元格的文本颜色。

当细胞出队,你需要设置根据您的阵列其颜色。这将确保您的单元格在滚动和关闭屏幕时具有正确的颜色。