4

目前我正在尝试自定义 UITableViewCell 中的 delte 按钮。现在我有类似的东西:

在此处输入图像描述

现在,我只需要改变这个按钮的颜色,我不想改变行为,或者让它完全自定义。我确信这是可能的,无需创建自己的控件来删除 UITableView 中的行。

这是我的代码:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            deleteButtonView.backgroundColor = [UIColor greenColor];
        }
    }
}

我怎么能这样做?

提前致谢!

4

6 回答 6

5

UITableViewCellDeleteConfirmationControl 不是一个公共类,你不能轻易改变它的外观。

为此,我相信您必须遍历单元格的子视图并更改其属性:

for (UIView *subview in self.subviews) {
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") {
        // Set the background using an image.
    }
}

当然,你应该警惕做这种事情,因为它相当脆弱。我建议您自己滚动。

我建议向 Apple提交错误报告,以请求能够更轻松地对其进行编辑。

于 2012-08-26T15:11:01.460 回答
4

在 UITableViewCell 子类中:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    for(UIView *subview in view.subviews) {
        if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
        UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
        if(recursiveResult) return recursiveResult;
    }
    return nil;
}

-(void)overrideConfirmationButtonColor
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor];
    });
}

然后在 UITableViewDelegate 中:

-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    <#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
    [cell overrideConfirmationButtonColor];
}

这适用于 iOS 7.1.2

于 2014-07-28T08:42:20.757 回答
2

方法如下:

在滑动时激活删除按钮

// 确保在 uitableviewcontroller 中有以下方法

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"You hit the delete button.");
}

设置自定义文本标签而不是删除。

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

为按钮第 1 部分设置自定义颜色 - 警告,这在技术上涉及戳私有苹果 API。但是,您不会被阻止使用作为 UIKIT 一部分的公共方法搜索来修改子视图。

创建一个 uitableviewcell 类(另见https://stackoverflow.com/a/22350817/1758337

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        //iterate through subviews until you find the right one...
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                //your color
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
            }
        }
    }    
}

另一个注意事项:不能保证这种方法在未来的更新中有效。另请注意,提及或使用私有UITableViewCellDeleteConfirmationView类可能会导致 AppStore 拒绝。

为按钮第 2 部分设置自定义颜色

回到你的 uitableviewcontroller

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [YourTableView reloadData];
}

(直到下次在 tablecell 上调用 layoutSubviews 时才会调用备用颜色,因此我们通过重新加载所有内容来确保发生这种情况。)

于 2014-03-14T04:36:53.383 回答
2

silyevsk 的例子非常好……但是,六个月后,iOS 8 出现了,它不再正常工作了。

现在,您需要寻找一个名为“ _UITableViewCellActionButton”的子视图并设置它的背景颜色。

下面是我在我的应用程序中使用的 silyevsk 代码的修改版本。

在我的某些UITableView单元格上,我不希望用户能够滑动删除,但我确实希望在他们滑动时出现一些东西(挂锁图标)。

在此处输入图像描述

为此,我在bReadOnlyUITableViewCell 类中添加了一个变量

@interface NoteTableViewCell : UITableViewCell

. . . 

@property (nonatomic) bool bReadOnly;

-(void)overrideConfirmationButtonColor;

@end

我将 silyevsk 的代码添加到我的 .m 文件中:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    for(UIView *subview in view.subviews) {

        if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
            return subview;

        UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
        if(recursiveResult)
            return recursiveResult;
    }
    return nil;
}

-(void)overrideConfirmationButtonColor
{
    if (!bReadOnly)
        return;

    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton)
        {
            confirmationButton.backgroundColor = [UIColor lightGrayColor];

            UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
            imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
            imgPadLock.contentMode = UIViewContentModeCenter;     //  Don't stretch the UIImage in our UIImageView

            //  Add this new UIImageView in the UIView which contains our Delete button
            UIView* parent = [confirmationButton superview];
            [parent addSubview:imgPadLock];
        }
    });
}

此外,我需要更改填充 的代码UITableView,否则“删除”标签和挂锁图标会出现:

-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Note* note = [listOfNotes objectAtIndex:indexPath.row];
    if ( /* Is the user is allowed to delete this cell..? */ )
        return @"Delete";

    return @"      ";
}

它仍然很丑陋,并且依赖于这样的假设,即当 iOS 9 出现时这一切都不会改变。

于 2015-02-18T10:02:59.047 回答
1

这是解决方案:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
            [deleteButtonView addSubview:image];
        }
    }
}
于 2012-08-26T15:34:03.893 回答
1

IOS7 兼容答案(不是创建自定义类,而是扩展 UITableViewCell :

@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
            }
        }
    }
}
@end
于 2014-03-12T11:58:41.270 回答