使用 iOS 5 新功能在编辑模式下选择多个单元格时出现问题。 应用程序结构如下:
-> UIViewController
---> UITableView
----> CustomUITableViewCell
其中UIViewController
是UITableView
的委托和数据来源(出于要求原因,我使用的是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
,圆圈会正确更新其状态。
你有什么建议吗?提前谢谢。
答案 0 :(得分:5)
对于那些感兴趣的人,我找到了解决上一个问题的有效解决方案。
问题是当选择样式为UITableViewCellSelectionStyleNone
时,编辑模式下的红色复选标记无法正确显示。解决方案是创建自定义UITableViewCell
和ovverride一些方法。我正在使用awakeFromNib
,因为我的单元格是通过xib创建的。为了达到解决方案,我遵循了以下两个stackoverflow主题:
这里是代码:
- (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];
}
希望它有所帮助。