Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 禁用didSelectRowAtIndexPath中的单元格不工作?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 禁用didSelectRowAtIndexPath中的单元格不工作?

Ios 禁用didSelectRowAtIndexPath中的单元格不工作?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我使用上面的代码在用户单击单元格一次后禁用它。我遇到的问题是,当一个单元格被添加到表中时,新的单元格将被禁用,而以前禁用的单元格将不再被禁用 如何解决此问题?当用户滚动表格时,单元格将被重新使用。您需要跟踪用户禁用了哪些行,以便在cellforrowatinexpath中,您可以在每次请求时为每个单元格设置userInteractionEnabled属性(根据需要设置为YES或NO) 更新-更多详细信息 您需要跟踪用户选择的索引路径。在didSelectRow…方法中添加一个类型为NSMutab

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


如何解决此问题?

当用户滚动表格时,单元格将被重新使用。您需要跟踪用户禁用了哪些行,以便在
cellforrowatinexpath
中,您可以在每次请求时为每个单元格设置
userInteractionEnabled
属性(根据需要设置为YES或NO)

更新-更多详细信息

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

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

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

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.userInteractionEnabled = NO;
}
其中,
seletedpathsset
是您的
NSMutableSet
实例变量


此解决方案假定表中的行和节是固定的。如果用户可以执行导致行被添加、删除或移动的操作,那么您不能简单地跟踪索引路径。您需要使用其他一些键来知道选择了哪些行。

您是否在
cellForRowAtIndexPath
中使用
dequeueReusableCellWithIdentifier

你应该有这样的东西:

cell.userInteractionEnabled = ![theSelectedPathsSet containsObject:indexPath];
展开另一个答案,您可以通过执行类似于以下操作来跟踪以前是否选择了特定单元格(因此应禁用):

声明一个属性,如
@property(非原子,强)NSMutableArray*selectedCells然后:

- (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;
}

我的笔记本电脑即将死亡,但如果它崩溃,你应该查看初始化单元(alloc和init)的代码,或者保留之前的代码。

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

为什么
cell.userInteractionEnabled=NO?@fannheyward,因为我不希望该单元格在被单击一次后可用。我不明白:(请解释放在哪里更好…我真的很困惑。我已经有一个CellForRowatineXpath方法,当我在其中启用单元格时,禁用代码不会做任何事情。用户可以做一些事情,比如添加行。然后你需要跟踪另一个键,而不是每个选定行的
indexath
。这是什么你和你的数据决定你的未来。@jacobburbaker谢谢。如果它回答了你的问题,别忘了接受它(或者至少投票支持它)。这有助于回答这个问题吗?根据行是否已被选中,正确设置单元格的
userInteractionEnabled
属性的代码在哪里?不,我不太确定该放在哪里…我已经有一个大的cellforrowatindexpath方法,如果我放进去,整个应用程序都会崩溃。@scottastic-你的代码将被删除将所有行设置为无交互。如果单元格不在所选行列表中,则需要将
userInteractionEnabled
设置为
YES
。只有在有一个节且无法添加、删除或移动行时,代码才起作用。@jacobburbaker如果您认为这太复杂,请后退一步,执行some阅读关于表视图和一些基本目标的信息-C。这个解决方案并不复杂。
- (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;
}