更改UITableViewCellDeleteConfirmationControl在UITable

2019-07-31 04:33发布

我目前正试图在UITableViewCell的定制delte按钮。 现在,我有类似的东西:

现在,所有我需要的是改变这个按钮的颜色,我不想去改变,或者使其absolutelly定制。 我敢肯定,这是可能的,而不在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];
        }
    }
}

我怎么能这样做?

提前致谢!

Answer 1:

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

为了做到这一点,我相信你必须通过细胞的子视图进行迭代,并改变其属性:

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

当然,你应该警惕做这样的事情,因为其相当脆弱的。 我建议滚动您自己来代替。

我建议提交错误报告给苹果公司,要求能够更容易地编辑这个能力。



Answer 2:

在子类的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



Answer 3:

以下是如何:

激活刷卡删除按钮

//确保你在的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];
}

(备用颜色不会被下一次调用layoutSubviews被称为在TableCell的,直到,所以我们确保这种情况发生的一切都重新加载)。



Answer 4:

silyevsk的例子是极好的......可是,半年过去了,iOS 8的来了一起,而且它并不完全正常工作了。

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

以下是我已经在我的应用程序使用silyevsk的代码修改后的版本。

一些我的UITableView细胞,我不希望用户能够刷到删除,但我确实想要的东西(挂锁图标),当他们刷卡出现。

要做到这一点,我添加了一个bReadOnly变量,以我的UITableViewCell类,

@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走来的假设。



Answer 5:

这是解决方案:

- (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];
        }
    }
}


Answer 6:

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


文章来源: Changing the color of UITableViewCellDeleteConfirmationControl(Delete Button) in UITableViewCell