自定义UITableViewCell,UITableView和allowsMultipleSelectionDuringEditing

时间:2012-02-01 19:17:51

标签: ios uitableview ios5 multipleselection

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

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

其中UIViewControllerUITableView的委托和数据来源(出于要求原因,我使用的是UIViewController而不是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文件,其中superview包含一个UITableViewCell元素。为了提供自定义,我将该元素的类型设置为CustomUITableViewCell,其中CustomUITableViewCell扩展为UITableViewCell

@interface CustomTableViewCell : UITableViewCell

// do stuff here

@end

代码效果很好。在表格中显示自定义单元格。现在,在应用程序执行期间,我将allowsMultipleSelectionDuringEditing设置为YES,然后进入UITableView的编辑模式。看起来很有效。实际上,每个单元格旁边都会出现一个空圆圈。问题是,当我选择一行时,空圆圈不会改变其状态。理论上,圆圈必须从空变为红色复选标记,反之亦然。似乎圆圈仍然高于单元格的contentView

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

- (NSArray *)indexPathsForSelectedRows

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

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

你有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:5)

对于那些感兴趣的人,我找到了解决上一个问题的有效解决方案。 问题是当选择样式为UITableViewCellSelectionStyleNone时,编辑模式下的红色复选标记无法正确显示。解决方案是创建自定义UITableViewCell和ovverride一些方法。我正在使用awakeFromNib,因为我的单元格是通过xib创建的。为了达到解决方案,我遵循了以下两个stackoverflow主题:

  1. multi-select-table-view-cell-and-no-selection-style
  2. uitableviewcell-how-to-prevent-blue-selection-background-w-o-borking-isselected
  3. 这里是代码:

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

    希望它有所帮助。