iOS delete a tableview row

24,786

Solution 1

Try this sample tutorial,

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>
{
  NSMutableArray *arryData1;
  NSMutableArray *arryData2;
  IBOutlet UITableView *tableList;
}

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

 @end

@implementation ViewController

-(void)viewDidLoad
{
[super viewDidLoad];

arryData1 = [[NSMutableArray alloc] initWithObjects:@"MCA",@"MBA",@"BTech",@"MTech",nil];
arryData2 = [[NSMutableArray alloc] initWithObjects:@"Objective C",@"C++",@"C#",@".net",nil];
tableList.editing=YES;

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [arryData1 count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier= @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] ;
}
cell.textLabel.text = [arryData1 objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [arryData2 objectAtIndex:indexPath.row];
return cell;
}

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
    int index = indexPath.row;
    [arryData1 removeObjectAtIndex:index];
    [arryData2 removeObjectAtIndex:index];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];


}
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableList.editing)
{
    return UITableViewCellEditingStyleDelete;
}

return UITableViewCellEditingStyleNone;
}

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

Solution 2

I quess the problem is you're not reloading data again thus it's staying in cache memory

You can try to reload data with [tableView reloadData]; this method to the below of [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; this code line in your second solution.

Solution 3

To show delete button on cell swipe you must implement this delegate method.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

Try this, i hope this will work for you.

Solution 4

Use the tableview commiteditingstyle method to delete a cell/row of the tableviewcontroller.

Here is the workable code snip:

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

    [ArrayHoldsCellObj removeObjectAtIndex:indexPath.row];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

Note that the ArrayHoldsCellObj is the Array object you must declare and assign each cell to the area index.

Share:
24,786
diogo.appDev
Author by

diogo.appDev

Updated on November 26, 2020

Comments

  • diogo.appDev
    diogo.appDev over 3 years

    I had my app working fine on iOS 6. With the upgrade I stopped being able to delete rows from my UITableView.

    I've a button in my prototype cell.

    Here is the button's function:

    - (IBAction)deleteCell:(id)sender {
        UIButton *btn = (UIButton*) sender;
        UITableViewCell *cell = (UITableViewCell*) btn.superview.superview;
        NSIndexPath *indexPath = [_tableView indexPathForCell:cell];
        if([names count] > 9) {
            int index = indexPath.row;
            [names removeObjectAtIndex:index];
            [photos removeObjectAtIndex:index];
            [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
        } 
    } 
    

    The problem is my index variable is always 0.

    I tried another solution:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    
            if (editingStyle == UITableViewCellEditingStyleDelete) {
                int index = indexPath.row;
                [names removeObjectAtIndex:index];
                [photos removeObjectAtIndex:index];
                [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
    
    }
    }
    

    This solution doesn't work either. Nothing happens when I swipe right.