我可以使用UITableView的allowsMultipleSelectionDuringEditing设置为YES的自定义复选标记吗?

时间:2012-07-27 21:17:24

标签: objective-c cocoa-touch ios5 uitableview

一张图片胜过千言万语......

enter image description here

对于更多背景知识,我有一个UITableView,利用iOS 5的allowsMultipleSelectionDuringEditing设置为YES。这导致在单元格处于编辑模式时,单元格左侧显示空的和​​填充的编辑控件。这种行为正是我想要的。我只是想改变这些复选标记的外观。

我知道可以编写自定义选择逻辑并基本上滚动我自己的版本(如thisthis),但这就是我想要避免的。系统已经到位,我想尽可能多地重复使用。

1 个答案:

答案 0 :(得分:4)

这是我最接近的。它很简单并且有效,同时重复使用几乎所有的预烘烤系统。然而,它也是一个巨大的黑客攻击,并依赖于在一点运行时内省之后利用UITableViewCell的未记录的视图层次结构。

简而言之,这只是隐藏了通常负责显示复选标记的视图,允许我添加可以在其位置显示的我自己的视图。然后,当单元格的选择或编辑状态发生变化时,我可以操纵这个替换视图......

为防止出现标准复选标记,所需的只是自定义-layoutSubviews实施。根据文档,在-willTransitionToState:-setEditing:animated:之后调用它,确保在isSelectedisEditing更改时状态始终有效。

- (void)layoutSubviews
{
    [super layoutSubviews];

    // Find the offending view, and quietly bury it...
    for (UIView* subview in [self subviews])
    {
        // As determined by NSLogging every subview's class, and guessing which was the one I wanted
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"])
        {
            [subview setHidden:YES];
        }
    }

    if ([self isEditing])
    {
        // Show the custom view however you want. 
        // The value of [self isSelected] will be useful...
    }
    else
    {
        // Hide the custom view.
    }
}

我仍然会欢迎更多的解决方案......犹太教。