【问题标题】:Custom Delete button On Editing in UITableView Cell在 UITableView 单元格中编辑时自定义删除按钮
【发布时间】:2010-12-09 14:01:40
【问题描述】:

我已经通过this question 显示以下代码:

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

如果我想要自定义图像而不是默认的红色按钮怎么办?

【问题讨论】:

  • 让我举个例子。 MPMovieplayer 是私有的 api。那么 YouTube 如何定制呢? (YouTube 又添加了两个按钮添加到收藏夹,通过电子邮件发送此视频)。应该有办法。为什么苹果只对自己进行定制?
  • 要理解我之前的评论 - 阅读这个问题。 stackoverflow.com/questions/1596089/…
  • 这里有更好的更新解决方案stackoverflow.com/a/7395052/454165

标签: iphone uitableview


【解决方案1】:

luvieere 是对的——如果您想要同样的“删除”比喻,您希望将其保留在 Apple 提供的红色按钮上。为什么要改变它?它是全球公认的删除按钮的标准

不过,如果您想要 Tweetie 之类的东西,完全改变滑动的行为,您可以使用 ABTableViewCell 之类的东西,您只需在自己的视图中进行绘制。制作自定义表格视图,覆盖 -touchesBegan:withEvent:,并检查触摸。计算两次触摸的增量(在 touchesMoved:withEvent: 中)并移动您自己的视图。

【讨论】:

  • 好的。但是客户说,当我点击一个单元格时,应该有一个进入列表的按钮 - 播放列表。橙色。
  • 在这种情况下,您必须自己绘制按钮。
  • 嗨 Saurabh,我正在使用默认功能来显示删除按钮。但是我的背景也是红色的,因此无法区分删除按钮...所以我必须更改该按钮的颜色/图像....怎么办?
  • 这个答案绕过了实际问题,应该接受user1684899提供的工作答案
  • “为什么要改变它?” - 因为老板告诉我们,所以才这样做。
【解决方案2】:

正如您在对 luvieere 的回答的评论中所说,预期的列表潜入操作的系统范围标准是使用详细信息披露(蓝色圆圈箭头)单元配件,而不是滑动手势。

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

【讨论】:

    【解决方案3】:

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

    - (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 类中复制此代码时出现 2 个错误。错误是预期的表达式。
    • @G.Ganesh 查看代码中的方括号。通常显示错误是因为您有一对不需要的方括号。只需删除这些,您就可以开始了。
    • @G.Ganesh..我相信你现在一定已经想通了。不过,这就是原因。从这里复制并粘贴到 Xcode,结果是在每行的开头添加一些字符。不确定这些是什么,但你必须删除它们才能编译代码。
    • 如果是 ios7 那么你应该使用 UITableViewCellDeleteConfirmationControl_Legacy
    【解决方案4】:

    这是一个迟到的回复,但我希望有人会觉得这很有帮助。所以接受的答案对我来说似乎有点复杂,@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 中,这样您就可以在单击删除按钮时添加任何您想要的内容。这是我的结果:

    【讨论】:

    • 不发表任何评论就对自己的帖子投反对票是非常不合理的。这到底有什么用?
    • 只是想知道您在这里使用的是什么字体? Apple 是否使用您描述的方法接受了您的应用程序?
    • @sooper 那个字体是 Museo Sans,我最终使用了another library 而不是这个,所以我不能确定苹果是否会批准这个。
    • 我 NSLog 子视图的类。我没有找到 UITableViewCellDeleteConfirmationControl。我只有几个 _UITableViewCellSeparatorView
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多