问题:重复使用多个选择tableview单元格

时间:2011-06-14 07:06:32

标签: iphone objective-c uitableview

我有一个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];
}

但我有一个问题,细胞被重复使用。当我选择一个单元格时,其他地方的单元格也会被选中只有复选标记(或没有复选标记)被重用,其他细节,如行标题等,不会被重用。解决此问题的任何解决方案提前谢谢。

3 个答案:

答案 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;
}

最好在设置任何特定属性之前重置单元格。