webentwicklung-frage-antwort-db.com.de

Wischen, um TableView-Zeile zu löschen

Ich habe mein Array:

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

Ich habe alles versucht, was ich finden kann, aber es gibt immer Fehler. Ich möchte in der Lage sein, so zu streichen, dass die Schaltfläche "Löschen" angezeigt wird, und dann auf die Schaltfläche "Löschen" zu klicken und diese Zeile zu entfernen.

Vollständiger Code (alles, was sich auf die Tabelle bezieht):

// 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;

 }
27
JTApps

Sie müssen die erforderlichen UITableViewDelegate- und UITableViewDataSource-Methoden implementieren.

Zuerst füge das hinzu:

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

Dann:

- (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
    }
}
124
edc1591

Zunächst sollte Ihre colorNames ein NSMutableArray sein und kein NSArray. Sie können keine Objekte zu einem regulären (nicht veränderbaren) Array hinzufügen oder daraus entfernen. Sie müssen es jedes Mal neu erstellen, wenn Sie eine Änderung vorgenommen haben. Das Wechseln macht das einfacher. Für Ihre Implementierung von -tableView:commitEditingStyle:forRowAtIndexPath: können Sie dann Folgendes tun:

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

Implementieren Sie die folgende Methode:

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

Swift 3 und Swift 4 antworten ohne reloadData zu verwenden

Ich bevorzuge die Verwendung von deleteRows anstelle von 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()
    }
}
3
Anand

Swift Version:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
     if editingStyle == UITableViewCellEditingStyle.Delete {
         dataArray?.removeAtIndex(indexPath.row)
         tableview.reloadData()
     }
}
0
Irfan

Das hat bei mir funktioniert 

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

    if (editingStyle == UITableViewCellEditingStyleDelete){
        Comment *comment = [self.commentArray objectAtIndex:indexPath.row];
        dispatch_async(kBgQueue, ^{
            if([self.thePost deleteCommentForCommentId:comment.commentId]){
                if (indexPath.row < self.commentArray.count) {
                    [self.commentArray removeObjectAtIndex:indexPath.row];
                }
                dispatch_async(dispatch_get_main_queue(), ^{

                    [self.tvComments reloadData];
                });
            }
        });
    }
     [self.tvComments reloadData];
}
0
NSGodMode

Swift 4 Version:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
        // delete item at indexPath

    }
    return [delete]
}
0
Pratik Lad