Change the color of default red color delete button in UITableViewCell when swiping rows or click on edit button

前端 未结 5 1719
离开以前
离开以前 2020-11-28 04:43

I wanted to change the color of minus button and delete button of UITableViewCell when click on edit button or swiping UITableView rows. I have imp

5条回答
  •  野性不改
    2020-11-28 05:11


    iOS 8 and 9 (props to this post)


    Note: If you are working with an existing iOS 7 project, you'll need to update the target to iOS 8 to get this functionality. Also remember to set the UITableviewDelegate.

    All the magic now happens here (as many buttons as you want too!!!!):

     -(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.");
        }
    

    set custom text label instead of delete.

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

    set custom color for button part 1 - warning, this technically involves poking at the private apple API. However, you are not prevented from modifying a subview using a public method search that is part of UIKIT.

    Create a uitableviewcell class (see also 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];
                }
            }
        }    
    }
    

    Another note: there's no guarantee this approach will work in future updates. Also beware that mentioning or using the private UITableViewCellDeleteConfirmationView class may lead to AppStore rejection.

    set custom color for button part 2

    back in your uitableviewcontroller

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

    (The alternate color won't be called until the next time layoutSubviews is called on the tablecell, so we ensure this happens by reloading everything.)

提交回复
热议问题