Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS delete a tableview row

Tags:

ios

row

tableview

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.

like image 796
diogo.appDev Avatar asked Sep 23 '13 14:09

diogo.appDev


People also ask

How do you clear a Tableview cell?

So, to remove a cell from a table view you first remove it from your data source, then you call deleteRows(at:) on your table view, providing it with an array of index paths that should be zapped. You can create index paths yourself, you just need a section and row number.

What is difference between Tableview and collection?

1. The collection view is much more robust in terms of layout features and other things like animations. Tableiw is a simple list, which displays single-dimensional rows of data. It's smooth because of cell reuse and other magic.


4 Answers

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;
}
like image 52
Ravindhiran Avatar answered Oct 05 '22 17:10

Ravindhiran


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.

like image 37
mert Avatar answered Oct 05 '22 17:10

mert


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.

like image 31
Adnan Aftab Avatar answered Oct 05 '22 15:10

Adnan Aftab


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.

like image 40
James L Avatar answered Oct 05 '22 16:10

James L