我正在使用带有多个部分的分组tableview。 我必须在indexpath上实现didselectrow上的多项选择功能 方法。我的代码如下。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
else
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
允许我选择多个单元格 但当我滚动我的tableview时,我的选择消失了。
答案 0 :(得分:1)
当您滚动时,您的选择会消失,因为它会调用cellForRowAtIndexPath并且您无法处理选择。
要避免此问题,您可以执行以下操作: 在didSelectRowAtIndexPath中,您可以按如下方式保存所选行的索引路径:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
{
cell.accessoryType = UITableViewCellAccessoryNone;
//remove index path
[selectedIndexPathArray removeObject:path];
}
else
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[selectedIndexPathArray addObject:path];
}
}
并在cellForRowAtIndexPath
中,您可以检查是否选择了单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//If selectedIndexPathArray contains current index path then display checkmark.
if([selectedIndexPathArray containsObject:indexPath])
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
答案 1 :(得分:0)
试试这个
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
if (self.tableView.isEditing) {
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
} else {
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
return cell;
}
-(UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleMultiSelect;
}
-(IBAction) switchEditing {
[self.tableView setEditing:![self.tableView isEditing]];
[self.tableView reloadData]; // force reload to reset selection style
}
希望这有助于解决您的问题。(ref)
答案 2 :(得分:0)
您的选择消失,因为将在滚动时调用方法CellForRowAtIndexPath
。
您需要再次设置配件。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
// here
...
}
答案 3 :(得分:0)
您遇到此问题是因为您没有跟踪行选择。当回调方法 cellForRowAtIndexPath 为已消失的行/(向上/向下滚动)调用时,单元格对象不再记忆是否被选中。 (这些选择正在消失的原因)
我建议您使用像 NSMutableArray / NSArray 这样的集合来跟踪选定的行。 您可以使用这些方法中的任何一种。
这将是一个快速工作的修复: 根据用户选择在 didSelectRowAtIndexPath 中添加/删除索引路径对象 然后根据该数组的内容,你可以为相应的单元格切换cell.accessoryType的值。
理想情况下,您可以使用一个名为 selected 的布尔成员的数据bean / model,并且可以根据所做的选择更新其值。然后,您可以添加那些,而不是简单地添加这些索引路径有意义的数据bean对象到你的数组上并从bean的选择的属性中获取选择。即使用户杀死并重新启动应用程序,这种方法也可以帮助你恢复行选择如果你将bean对象保存在database / archive 中...(但这完全取决于你的用例和要求!)
希望这有帮助!