在滑动行或单击编辑按钮时,更改UITableViewCell中默认红色删除按钮的颜色

时间:2013-11-29 17:25:11

标签: ios iphone uitableview

我想在点击编辑按钮或滑动UITableViewCell行时更改减号按钮的颜色并删除UITableView的按钮。到目前为止,我已经实现了这段代码:

-(IBAction)doEdit:(id)sender
{

    [[self keyWordsTable] setEditing:YES animated:NO];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

}

5 个答案:

答案 0 :(得分:97)


iOS 8和9 props to this post


注意:如果您正在使用现有的iOS 7项目,则需要将目标更新到iOS 8才能获得此功能。还记得设置UITableviewDelegate。

所有的魔法现在都在这里发生(你想要的按钮也很多!!!!):

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

    return @[button, button2];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }


(iOS 7)


**activate the delete button on swipe**

// make sure you have the following methods in the 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时才会调用备用颜色,因此我们通过重新加载所有内容来确保这种情况发生。)

答案 1 :(得分:23)


Swift示例(iOS 8)

UITableViewDelegate docs( editActionsForRowAtIndexPath 方法)

  

返回值

     

表示操作的UITableViewRowAction对象数组   排。您提供的每个操作都用于创建一个按钮   用户可以点按。

     

<强>讨论

     

如果要为其提供自定义操作,请使用此方法   你的一个表行。当用户水平滑动时,   表视图将行内容移到一边以显示您的操作。   点击其中一个操作按钮会执行存储的处理程序块   与行动对象。

     

如果未实现此方法,则表视图将显示   用户滑动行时的标准附件按钮。

Swift中的工作示例:

@available(iOS 8.0, *)
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let button1 = UITableViewRowAction(style: .Default, title: "Happy!") { action, indexPath in
        print("button1 pressed!")
    }
    button1.backgroundColor = UIColor.blueColor()
    let button2 = UITableViewRowAction(style: .Default, title: "Exuberant!") { action, indexPath in
        print("button2 pressed!")
    }
    button2.backgroundColor = UIColor.redColor()
    return [button1, button2]
}

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
}

答案 2 :(得分:3)

第一次在.m(自定义单元格)中调用willTransitionTo状态

- (void)willTransitionToState:(UITableViewCellStateMask)state{
    NSLog(@"EventTableCell willTransitionToState");
    [super willTransitionToState:state];
    [self overrideConfirmationButtonColor];
}

检查iOS版本,它在这里,我使用的是iOS 7 - iOS8

//at least iOS 8 code here
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
        // iOS 8+ code here
        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;
        }
    }

    else{
        // Pre iOS 8 code here
        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)
        {
            UIColor *color = UIColorFromRGB(0xFF7373);
            confirmationButton.backgroundColor = color;

        }
    });
}

答案 3 :(得分:2)

无法使用公共API。

对于删除按钮,您可以使用自定义实现(例如SWTableViewCell)来更改按钮的颜色,以及添加其他按钮。

答案 4 :(得分:1)

旧问题,但我确定有些人支持iOS 7。 要更改删除按钮背景颜色,您需要创建“UITableViewCell”类或扩展它。 然后你可以使用

transform: scale(0.5)