在UITableView单元格的编辑模式下自定义删除按钮

26

我已经浏览了这个问题,它展示了以下代码:

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    return @"Sagar";
}

如果我想要一个自定义的图片代替默认的红色按钮怎么办?


让我给出一个例子。MPMoviePlayer是私有API,那么YouTube怎么能够自定义它呢?(YouTube添加了两个按钮:添加到收藏夹,将此视频通过电子邮件发送)。肯定有某种方法。为什么苹果只限于自己进行自定义呢? - sagarkothari
要理解我之前的评论,请阅读这个问题。https://dev59.com/FUnSa4cB1Zd3GeqPR-Rq - sagarkothari
这里有更好、更更新的解决方案:https://dev59.com/jms05IYBdhLWcg3wLe8j#7395052 - Paul N
4个回答

34

在自定义单元格中实现此方法

- (void)willTransitionToState:(UITableViewCellStateMask)state{
    [super willTransitionToState:state];
    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask) {
        for (UIView *subview in self.subviews) {
            if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
                UIImageView *deleteBtn = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 64, 33)];
                [deleteBtn setImage:[UIImage imageNamed:@"delete.png"]];
                [[subview.subviews objectAtIndex:0] addSubview:deleteBtn];
                [deleteBtn release];
            }
        }
    }
}

@user1684899,当我将这段代码复制到CustomCell类中时,出现了两个错误。错误是预期表达式。 - Ganesh G
@G.Ganesh,请检查您代码中的方括号。通常出现此错误是因为您有一对不必要的方括号。只需删除它们,您就可以继续了。 - tyegah123
@G.Ganesh..我相信你现在一定已经弄清楚了。不过,这就是原因。从这里复制并粘贴到Xcode中,会导致每行开头添加一些字符。不确定那些是什么,但你需要删除它们才能使代码编译。 - Sahitya Tarumani
如果是针对iOS7,则应使用UITableViewCellDeleteConfirmationControl_Legacy。 - Saren Inden

7
这是个晚回复,但是我希望有人会发现这有用。所以被认可的答案对我来说似乎有点复杂,而@user1684899的答案只适用于想要改变删除按钮外观的情况。我想完全改变删除按钮的外观(例如其框架、位置等),因此我的解决方案是将自己的删除按钮添加到自定义单元格中,并在编辑模式下仅显示它,最重要的是,我想隐藏iOS的原始删除按钮并支持向后兼容,这就是我的技巧:
- (void)willTransitionToState:(UITableViewCellStateMask)state
{
    [super willTransitionToState:state];
    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask)
    {
        if (!IS_IOS_7){
            for (UIView *subview in self.subviews)
            {
                if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
                {
                    // hide original button
                    [[subview.subviews objectAtIndex:0] setHidden:YES];
                    // show my custom button
                    [self.deleteButton setHidden:NO];
                }
            }

        } else {
            for (UIView *subview in self.subviews) {
                for (UIView *subview2 in subview.subviews) {
                    if ([NSStringFromClass([subview2 class]) rangeOfString:@"Delete"].location != NSNotFound) {
                        // hide original button
                        [subview2 setHidden:YES];
                        // show my custom button
                        [self.deleteButton setHidden:NO];
                    }
                }
            }
        }
    } else {
        // hide my custom button otherwise
        [self.deleteButton setHidden:YES];
    }
}

不要忘记添加以下内容:
[cell.deleteButton addTarget:self action:@selector(deleteEntryAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];

cellForRowAtIndexPath中,当点击删除按钮时您可以添加任何您想要的内容。以下是我的结果:

enter image description here


在没有任何评论的情况下,对某人的帖子进行负评是非常不合理的。这有什么帮助吗? - huong
请问您在这里使用的字体是什么?并且您所描述的方法是否被苹果接受了? - sooper
@sooper 那个字体是Museo Sans,我最终使用了另一个库,所以我不能确定苹果是否会批准这个。 - huong
4
我打印了子视图的类。我没有找到UITableViewCellDeleteConfirmationControl,只得到了几个_UITableViewCellSeparatorView。 - Yi Jiang

1

根据您在luvieere答案评论中的说法,用于意图进行列表深入操作的系统范围标准应该是使用详细信息披露(蓝色圆圈箭头)单元格附件,而不是滑动手势。

话虽如此,如果您仍想使用滑动操作,则无法提供自己的按钮,除非手动拦截并完全重新实现滑动手势,就像Tweetie所做的那样。


0

luvieere是正确的 - 如果您想要相同的“删除”隐喻,您需要将其保留在Apple提供的红色按钮上。为什么要改变它?它作为删除按钮的标准在全球范围内广为人知。

虽然,如果您想要像Tweetie一样完全更改滑动的行为,您可以使用类似ABTableViewCell的东西,在其中只需绘制自己的视图。创建自定义表视图,覆盖-touchesBegan:withEvent:并检查触摸。计算两个触摸之间的增量(在touchesMoved:withEvent:中),并移动您自己的视图。


在这种情况下,您将不得不自己绘制按钮。 - Saurabh Sharan
@Satyamsvv,你不能这样做,你必须创建自己的视图并像Saurabh所说的那样移动它们。 - Tieme
这里有一个更好、更新的解决方案:https://dev59.com/jms05IYBdhLWcg3wLe8j#7395052 - Paul N
2
这个回答绕开了实际问题,应该接受用户1684899提供的工作答案。 - thgc
15
“为什么要改变它?” - 因为老板告诉我们要这样做。 - Chris Harrison
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接