4

我在使用iOS 5新功能在编辑模式下选择多个单元格时遇到问题。应用结构如下:

-> UIViewController
---> UITableView
----> CustomUITableViewCell

UIViewController委托和数据源都在哪里UITableView(出于需求原因,我使用的是 anUIViewController而不是,UITableViewController我无法更改它)。单元格被加载到UITableView类似下面的代码中。

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = (CustomTableViewCell*)[tv dequeueReusableCellWithIdentifier:kCellTableIdentifier];
    if (cell == nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCellXib" owner:self options:nil];     
        cell = self.customTableViewCellOutlet;    
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    // configure the cell with data
    [self configureCell:cell atIndexPath:indexPath];    

    return cell;
}

单元界面是从 xib 文件创建的。特别是,我创建了一个新的 xib 文件,其中超级视图由一个UITableViewCell元素组成。为了提供自定义,我将该元素的类型设置为CustomUITableViewCell, 其中CustomUITableViewCellextends UITableViewCell

@interface CustomTableViewCell : UITableViewCell

// do stuff here

@end

代码运行良好。在表格中显示自定义单元格。现在,在应用程序执行期间,我设置allowsMultipleSelectionDuringEditingYES并进入UITableView. 它似乎工作。事实上,每个单元格旁边都会出现一个空圆圈。问题是当我选择一行时,空圆圈不会改变它的状态。理论上,圆圈必须从空变为红色复选标记,反之亦然。似乎圆圈仍然contentView在单元格的上方。

我做了很多实验。我还检查了以下方法。

- (NSArray *)indexPathsForSelectedRows

并在编辑模式下选择期间更新。它显示正确的选定单元格。

我不太清楚的是,当我尝试在没有自定义单元格的情况下工作时,只有使用UITableViewCell,圆圈会正确更新其状态。

你有什么建议吗?先感谢您。

4

1 回答 1

5

对于那些有兴趣的人,我找到了解决先前问题的有效解决方案。The problem is that when selection style is UITableViewCellSelectionStyleNonered checkmarks in editing mode aren't displayed correctly. 解决方案是创建一个自定义UITableViewCell并覆盖一些方法。我正在使用awakeFromNib,因为我的单元格是通过 xib 创建的。为了达到解决方案,我遵循了这两个 stackoverflow 主题:

  1. 多选表视图单元格和无选择样式
  2. uitableviewcell-how-to-prevent-blue-selection-background-wo-borking-isselected

这里的代码:

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_normal"]] autorelease];
    self.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_selected"]] autorelease];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected && !self.isEditing)
    {

        return;
    }        

    [super setSelected:selected animated:animated];
}

- (void)setHighlighted: (BOOL)highlighted animated: (BOOL)animated
{
    // don't highlight
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

}

希望能帮助到你。

于 2012-02-02T14:33:38.377 回答