Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 implemented this code so far :

-(IBAction)doEdit:(id)sender {      [[self keyWordsTable] setEditing:YES animated:NO]; }  - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {     if (editingStyle == UITableViewCellEditingStyleDelete) {  } 
like image 937
Hussain Shabbir Avatar asked Nov 29 '13 17:11

Hussain Shabbir


1 Answers


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.)

like image 115
timothykc Avatar answered Oct 26 '22 20:10

timothykc