Swipe To Delete TableView Row

64,048

Solution 1

You have to implement the necessary UITableViewDelegate and UITableViewDataSource methods.

First, add this:

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

Then:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //remove the deleted object from your data source.
        //If your data source is an NSMutableArray, do this
        [self.dataArray removeObjectAtIndex:indexPath.row];
        [tableView reloadData]; // tell table to refresh now
    }
}

Solution 2

For a start, your colorNames should be an NSMutableArray rather than an NSArray. You can’t add or remove objects from a regular (non-mutable) array; you’d have to recreate it each time you made a change. Switching that will make this easier. For your implementation of -tableView:commitEditingStyle:forRowAtIndexPath:, you’ll then be able to do something like this:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(editingStyle == UITableViewCellEditingStyleDelete)
    {
        [colorNames removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    }
}

Solution 3

Implement the following method:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleDelete;
}

Solution 4

Swift 3 and Swift 4 answer without using reloadData

I prefer using deleteRows instead of using reloadData.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    // Enables editing only for the selected table view, if you have multiple table views
    return tableView == yourTableView
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        // Deleting new item in the table
        yourTableView.beginUpdates()
        yourDataArray.remove(at: indexPath.row)
        yourTableView.deleteRows(at: [indexPath], with: .automatic)
        yourTableView.endUpdates()
    }
}
Share:
64,048
Jtaylorapps
Author by

Jtaylorapps

Updated on December 07, 2020

Comments

  • Jtaylorapps
    Jtaylorapps over 3 years

    I have my array:

    self.colorNames = [[NSArray alloc] 
    initWithObjects:@"Red", @"Green",
    @"Blue", @"Indigo", @"Violet", nil];
    

    I've tried everything I can find, but there's always errors. I want to be able to swipe so that the delete button appears, and then press the delete button and have that row removed.

    Full code (everything relating to the table):

    // HEADER FILE
    @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    
      IBOutlet UITableView *tableView;
        NSMutableArray *colorNames;
    
    }
    @property (strong, nonatomic) NSArray *colorNames;
    
    
    @end
    
    // IMPLEMENTATION
    
    #import "ViewController.h"
    
    @implementation ViewController
    
    @synthesize colorNames; 
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        self.colorNames = [[NSMutableArray alloc] 
        initWithObjects:@"Red", @"Green",
        @"Blue", @"Indigo", @"Violet", nil];
    
        [super viewDidLoad];
        //[tableView setEditing:YES animated:NO];
    }
    
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
     }
    
    // Customize the number of rows in the table view.
    - (NSInteger)tableView:(UITableView *)tableView  numberOfRowsInSection:(NSInteger)section {
        int count = [colorNames count];
        return count;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    }  
    
     // Customize the appearance of table view cells.
     - (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
     static NSString *CellIdentifier = @"Cell";
    
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
     if (cell == nil) {
         cell = [[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:CellIdentifier];
    
     }
         // Configure the cell.
         cell.textLabel.text = [self.colorNames objectAtIndex: [indexPath row]];
    
     return cell;
    
     }