Wie kann Swipe aktiviert werden, um Zellen in einer TableView zu löschen?

75

Ich habe ein UIViewController, das TableViews-Delegaten- und Datenquellenprotokolle implementiert . Jetzt möchte ich den Zellen die Geste "Wischen zum Löschen" hinzufügen.

Wie soll ich vorgehen?

Ich habe eine leere Implementierung der commitEditingStyleMethode angegeben und auch die Editing-Eigenschaft auf YES gesetzt.

Die Wischfunktion kommt immer noch nicht.

Muss ich jetzt UISwipeGesturejede Zelle separat hinzufügen ?

Oder fehlt mir etwas?

Amogh Talpallikar
quelle
Verweisen Sie auf den Link, es kann Ihnen helfen, stackoverflow.com/questions/3309484/…
Sharme
2
Ich habe commitEditingStyle überschrieben und Editing auf YES gesetzt, und JETZT habe ich auch CanEditRowAtIndexPath überschrieben. Es werden normale Bearbeitungssteuerelemente aktiviert, die beim Klicken auf die Schaltfläche Löschen angezeigt werden. Aber nicht beim Wischen! Liegt es daran, dass Meine Klasse eine Unterklasse von UIViewController ist und nur die Delegaten- und Datenquellenmethoden implementiert, nicht jedoch UITableViewController, die möglicherweise etwas tun, um eine Wischgeste zu aktivieren.
Amogh Talpallikar
Ich habe gestern gerade ein UITableView als IBOutlet in einem UIViewController eingerichtet und genau wie in dem Beitrag, den ich gezeigt habe, muss ich mit dem Finger über das Löschen streichen. Ich kann also sagen, dass Sie keine Wischgesten aktivieren müssen. Wenn Sie es jedoch nicht auf andere Weise zum Laufen bringen können, müssen Sie möglicherweise darauf zurückgreifen.
Gurooj
Nachdem das Problem behoben war, hatte ich editStyleForRowAtIndexPath tatsächlich überschrieben und es gab None zurück, wenn sich die Tabelle nicht im Bearbeitungsmodus befand und das war das Problem. Ich habe diese Methode für etwas hinzugefügt, das ich zuvor getan habe, aber vergessen, sie zu entfernen, als sich die Anforderung geändert hat.
Amogh Talpallikar

Antworten:

54

Sie müssen nicht festlegen, editing:YESob beim Streichen der Zelle die Schaltfläche Löschen angezeigt werden soll. Sie müssen tableView:canEditRowAtIndexPath:YES für Zeilen implementieren und von dort zurückgeben, die Sie bearbeiten / löschen müssen. Dies ist nicht erforderlich, wenn die dataSource Ihrer tableView eine Unterklasse von UITableViewContoller ist. Wenn diese Methode nicht überschrieben wird, wird standardmäßig YES zurückgegeben. In allen anderen Fällen müssen Sie es implementieren.

BEARBEITEN: Gemeinsam haben wir das Problem gefunden - tableView:editingStyleForRowAtIndexPath:zurückgegeben, UITableViewCellEditingStyleNonewenn sich die Tabelle nicht im Bearbeitungsmodus befand.

Kyr Dunenkoff
quelle
Hast du entfernt [tableView setEditing:YES];?
Kyr Dunenkoff
Wenn ich es entferne, kommt die grundlegende Schaltfläche zum Löschen überhaupt nicht!
Amogh Talpallikar
3
Wenn Sie es nicht entfernen, versetzen Sie Ihre Tabelle in einen Bearbeitungsstatus, in dem Wischvorgänge nicht funktionieren. Es ist entweder ein runder roter Minusknopf auf der linken Seite oder ein Wisch, nicht zusammen.
Kyr Dunenkoff
1
Jetzt habe ich die setEditing-Anweisung entfernt, aber beim Wischen passiert nichts. Liegt es daran, dass ich einen UIViewController und keinen TabelViewController verwende, der möglicherweise standardmäßig jeder Zelle Wischgesten hinzufügt?
Amogh Talpallikar
5
Ich möchte hinzufügen, dass dies tableView:canEditRowAtIndexPath:möglicherweise nicht ausreicht. Sie müssen auch implementieren tableView:commitEditingStyle:forRowAtIndexPath.
Dan Loewenherz
61

Wie Dan oben kommentiert hat, müssen Sie die folgenden Delegatmethoden für Tabellenansichten implementieren:

  1. tableView:canEditRowAtIndexPath:
  2. tableView:commitEditingStyle:forRowAtIndexPath:

Hinweis: Ich habe dies in iOS 6 und iOS 7 versucht.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return YES - we will be able to delete all rows
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Perform the real delete action here. Note: you may need to check editing style
    //   if you do not perform delete only.
    NSLog(@"Deleted row.");
}
Dj S.
quelle
3
Ich habe dies gerade in iOS 8.1.2 auf einem iPhone 6 getestet und es funktioniert. Ich musste die - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPathMethode nur implementieren , da die Bearbeitung standardmäßig JA sein sollte.
Kramer
25
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}



// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
Kann Aksoy
quelle
6
Bemerkenswert / Kommentar für Neulinge wie mich: Die Zeile muss noch gelöscht werden, und die Datenquelle (z. B. Array) muss reduziert werden.
BananaAcid
12

Bitte versuchen Sie diesen Code schnell,

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}
Masa S-AiYa
quelle
5

Versuchen Sie, Ihrer Klasse Folgendes hinzuzufügen:

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}
David M. Syzdek
quelle
5
funktioniert nicht für mich :( Liegt es daran, dass meine Klasse eine Unterklasse von UIViewController ist und ich etwas extra tun muss, was UITabelViewController tut?
Amogh Talpallikar
1
@ AmoghTalpallikar, wie haben Sie Ihr Problem gelöst? Könnten Sie Ihre Lösung veröffentlichen? Ich habe auch das gleiche Problem. Außerdem ist meine Klasse eine Unterklasse von UIViewController, und alle Zellen meiner tableView sind Unterklassen von UITableViewCell.
Shamsiddin
3

Fazit des Kyr Dunenkoff Chats ist

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

}

sollte nicht definiert werden, wenn Sie die Schaltfläche "Löschen" benötigen, um beim Wischen angezeigt zu werden.

Thiru
quelle
1

Wenn Sie NSFetchedResultsControllerDelegatedie Tabellenansicht mit a füllen, hat dies bei mir funktioniert:

  • Stellen Sie sicher, dass tableView:canEditRowAtIndexPathreturn immer true ist
  • tableView:commitEditingStyle:forRowAtIndexPathLöschen Sie in Ihrer Implementierung die Zeile nicht direkt aus der Tabellenansicht. Löschen Sie es stattdessen mit Ihrem verwalteten Objektkontext, z.

    if editingStyle == UITableViewCellEditingStyle.Delete {
        let word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word
        self.managedObjectContext.deleteObject(word)
        self.saveManagedObjectContext()
    }
    
    func saveManagedObjectContext() {
        do {
            try self.managedObjectContext.save()
        } catch {
            let saveError = error as NSError
            print("\(saveError), \(saveError.userInfo)")
        }
    }
    
GabeV
quelle
0

Dies ist die schnelle Version

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return NO if you do not want the specified item to be editable.
    return true
}

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}
JZAU
quelle
0

Dies war auch für mich ein Problem ... Ich konnte nur einmal alle 10 Versuche wischen, um zu löschen, um zu arbeiten. Es stellte sich heraus, dass das gestureFernsehgerät durch eine andere Geste im Controller der übergeordneten Ansicht blockiert wurde. Der Fernseher war in einem MMDrawerController(wischbaren Schubladenlayout) verschachtelt .

Durch einfaches Konfigurieren des Gestenerkenners in der Schubladensteuerung, um nicht auf geschlossene Gesten in den flankierenden Schubladen zu reagieren, konnte das Wischen gelöscht werden, um in meinem Fernseher zu funktionieren.

Sie können auch versuchen, so etwas mit folgendem zu tun gesture delegate:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
Kevin
quelle
Ich weiß, dass dies alt ist, aber ich habe genau das gleiche Problem mit MMDrawerController. Könnten Sie näher darauf eingehen, "den Gestenerkenner in der Schubladensteuerung so zu konfigurieren, dass er nicht auf geschlossene Gesten in den flankierenden Schubladen reagiert, damit das Streichen gelöscht werden kann, um in meinem zu funktionieren." FERNSEHER". Wie machst du das?
Mark
0

Meiner Erfahrung nach müssen Sie editingam UITableViewSet sein, NOdamit das Wischen zur Arbeit geht.

self.tableView.editing = NO;

kgaidis
quelle
0

Nach iOS 8.0 können Sie Ihre Aktion anpassen

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
user501836
quelle
-1
NSMutableArray *post= [NSMutableArray alloc]initWithObject:@"1",@"2",@"3",nil]; 


- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
           editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSUInteger row = [indexPath row];
    NSUInteger count = [posts count];

    if (row < count) {
        return UITableViewCellEditingStyleDelete;
    } else {
        return UITableViewCellEditingStyleNone;
    }
}

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

    NSUInteger row = [indexPath row];
    NSUInteger count = [posts count];

    if (row < count) {

        [posts removeObjectAtIndex:row];
    }
}
Vimal Raval
quelle
-2

Sie können alle erforderlichen Methoden anzeigen, indem Sie eine UITableViewController-Klasse (temporär) in XCode 5 erstellen und dann kopieren, welche Methode Sie verwenden möchten. Die Methoden, die Sie benötigen, werden mit vorab ausgefüllten Zeilen auskommentiert, die Sie wünschen.

Emin Bugra Saral
quelle
1
Nun, diese Antwort ist sicher für andere Leute, die nach der Antwort suchen. :)
Emin Bugra Saral