我有一个tableview,每次选择一行时都需要显示一个复选标记。 (多选)我的代码如下。我也可以取消选择一行。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *RootViewControllerCell = @"RootViewControllerCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RootViewControllerCell];
if(nil == cell)
{
cell = [[[UITableViewCell alloc]initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease];
}
cell.textLabel.font = [UIFont fontWithName:[NSString stringWithFormat:@"HelveticaNeue-Bold"] size:12];
textView.textColor = [UIColor colorWithRed:0.281 green:0.731 blue:0.8789 alpha:1];
cell.textLabel.text = [optionsArray objectAtIndex:[indexPath row]];
if (pathIndex == indexPath)
{
if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
else {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
pathIndex = indexPath;
[surveytableView reloadData];
}
但我有一个问题,细胞被重复使用。当我选择一个单元格时,其他地方的单元格也会被选中只有复选标记(或没有复选标记)被重用,其他细节,如行标题等,不会被重用。解决此问题的任何解决方案提前谢谢。
答案 0 :(得分:2)
将其添加到cellForRowAtIndexPath
:
if ([tableView.indexPathsForSelectedRows containsObject:indexPath]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else if (![tableView.indexPathsForSelectedRows containsObject:indexPath]) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
为我工作
答案 1 :(得分:0)
在你的
if (pathIndex == indexPath)
你要比较指针而不是它们的值,试试
[pathIndex isEqual:indexPath]
或使用
- (NSComparisonResult)compare:(NSIndexPath *)otherObject;
接下来,您要为pathIndex指定一个值,而不保留或复制它,如
pathIndex = [indexPath copy];
(当然,既然你保留了这个值,在复制新对象之前你必须释放前一个[pathIndex发布];)
最后,您的实施不提供多重选择,只有单一选择。您可以尝试在NSMutableArray中添加和删除NSIndexPath对象,并检查它们是否存在于cellForRowAtIndexPath的可变数组中。
答案 2 :(得分:0)
问题是如果当前行与pathIndex匹配,你只对附件做一些事情,那么如果它是正常的单元格呢?你永远不会把它归还。你想......
cell.accessoryType = UITableViewCellAccessoryNone;
if ([pathIndex isEqual:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
最好在设置任何特定属性之前重置单元格。