禁用didSelectRowAtIndexPath中的单元格不起作用?

时间:2013-09-25 02:36:29

标签: ios objective-c uitableview

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.userInteractionEnabled = NO;
}

我使用上面的代码在用户点击一次后禁用单元格。我遇到的问题是,当一个单元格被添加到表格中时,该新单元格被禁用,之前被禁用的单元格不再存在。

如何解决此问题?

3 个答案:

答案 0 :(得分:0)

当用户滚动表格时,单元格会被重用。您需要跟踪用户已禁用的行,因此在cellForRowAtIndexPath中,您可以在每次请求时为每个单元格设置userInteractionEnabled属性(根据需要设置为YES或NO)。

更新 - 更多详情。

您需要跟踪用户选择的索引路径。添加NSMutableSet类型的实例变量,并在indexPath方法中将每个didSelectRow...添加到此变量中。

然后在cellForRow...方法中,您需要检查当前indexPath是否在集合中。根据结果​​设置单元格的userInteractionEnabled属性:

cell.userInteractionEnabled = ![theSelectedPathsSet containsObject:indexPath];

其中theSeletedPathsSet是您的NSMutableSet实例变量。

此解决方案假定表中的行和部分是固定的。如果用户可以执行导致添加,删除或移动行的操作,则无法简单地跟踪索引路径。您需要使用其他一些键来了解哪些行已被选中。

答案 1 :(得分:0)

您是否在dequeueReusableCellWithIdentifier使用了cellForRowAtIndexPath

你应该有这样的东西:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *reuseIdentifier = @"myTableViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (!cell) {
      cell = [[ArticleTableViewCell alloc] init];
}
// customise cell here (like cell.title = @"Woopee";)
if (self.selectedCells containsObject:[NSString stringWithFormat:@"%d", indexPath.row]] {
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.userInteractionEnabled = NO;
}
return cell;
}

扩展另一个答案,您可以通过以上操作来跟踪先前是否已选择某个特定单元格(因此应该被禁用):

声明类似@property (nonatomic, strong) NSMutableArray *selectedCells;的属性:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    [self.selectedCells addObject:[NSString stringWithFormat:@"%d", indexPath.row]];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.userInteractionEnabled = NO;
}

我的笔记本电脑即将死机,但是如果它崩溃了你应该看一下代码初始化单元格(alloc和init)或保留你之前的那些。

答案 2 :(得分:0)

您需要记录已禁用的单元格。您可以将所选单元格的indexPath存储在一个数组中,然后使用它来确定哪些单元格应该处于活动状态且在单元格中不活动:forRowAtIndexPath:方法。