2015-01-12 9 views
11

Ich habe eine UITableView, für die ich einige benutzerdefinierte Slide-Out-Schaltflächen hinzugefügt habe. Alle funktionieren wie erwartet. Es gibt jedoch ein Szenario in meiner Tabelle, in dem sich eine Zeile in einem Zustand befinden kann, in dem keine der Ausblendschaltflächen relevant ist. Daher habe ich ein leeres Array von Aktionen zurückgegeben, sodass die Ausblendschaltflächen nicht angezeigt werden. Unglücklicherweise beendet das UITableView den Aufruf von editActionsForRowAtIndexPath und deaktiviert die Ausblendschaltflächen für alle Zeilen in meiner Tabelle ... und es scheint dauerhaft zu sein, bis die App neu gestartet wird.UITableView editActionsForRowAtIndexPath funktioniert nicht mehr, wenn Sie ein leeres Array zurückgeben

Ist das erwartete Verhalten?

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? 
{ 
    if mydata[indexPath.row].EditAvailable() 
    { 
     var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler) 
     return [editAction] 
    } 
    else 
    { 
     return [] 
    } 
} 
+1

A [long shot] (http://nshipster.com/at-compiler-directives/), aber versuchen zurückzukehren @ [] –

+0

ich das @ -Zeichen aus Objective-C erkennen ... aber ist es gültig in swift? –

+0

Ich dachte, ich habe gesehen, dass es in Swift irgendwo in der Nähe verwendet wurde, kann es jetzt aber nicht finden (zum Erstellen und Initialisieren von Arrays). Ist mydata immer ein zugreifbares Array mit mydata.length == indexpath Anzahl der Zeilen? –

Antwort

0

ich ähnliche selektive Nutzung von Aktionen für einige Tablecell mit OB-c umgesetzt (habe in swift nicht getestet) vor einer Weile, aber die Selektivität in handleSwipe setzen, unter i für alle außer dem letzten eine Aktion haben:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer{ 
    CGPoint location = [gestureRecognizer locationInView:self.tableView]; 
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:location]; 
    if(!(swipedIndexPath.row<[coreDataHelper getAllTimerLists].count)){ 
     [self.tableView setEditing:!self.tableView.editing animated:YES]; 
    } 
} 

ist diese Hilfe Sie oder benötigen Sie mehrere verschiedene Aktionen Array, wie im Gegensatz hierzu die nur ein Array hat und deaktiviert/aktiviert das?

+0

Dies ist ein interessanter alternativer Vorschlag. Wenn ich es richtig verstehe, fangen Sie das Swipe-Ereignis ab, bevor es überhaupt in die Tabellenansicht gelangt, und verhindern somit, dass editActionsForRowAtIndexPath überhaupt aufgerufen wird, was die Rückgabe eines leeren Aktionsarrays verhindert und daher das Verhalten vermeidet. –

+0

Das ist richtig. (Dies wird in der Produktion verwendet). –

7

Bitte versuchen Sie tableView:editingStyleForRowAtIndexPath: zu verwenden.
Sie können das Ein/Aus der Folie selbst steuern.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (/* mydata[indexPath.row].EditAvailable() */) { 
     return UITableViewCellEditingStyleDelete; 
    } else { 
     return UITableViewCellEditingStyleNone; 
    } 
} 

(testete ich in Objective-c)

20

So wie ich dieses Problem gelöst war, die Funktion,

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 

hier zu implementieren, sollten Sie nur falsch zurück, wenn Sie nicht tun möchte, dass die erwartete Zeile die Swipe-Funktion hat.

So würden Sie Code in etwa so aussehen

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    return mydata[indexPath.row].EditAvailable() 
} 

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? 
{ 
    var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler) 
    return [editAction] 
} 

Die editActionsForRowAtIndexPath wird dann nur für diejenigen genannt, die Sie angegeben bearbeitet werden können.

1

Sie sollten kein leeres Array für die Aktionen bei editActionsForRowAtIndexPath zurückgeben. Wenn Sie die Zeile nicht editierbar machen möchten ... Rückgabe false bei canEditRowAtIndexPath. Sobald Sie ein leeres Array zurückgeben, werden in allen Zeilen die Swipe-Schaltflächen nicht mehr angezeigt. Es ist ein seltsames Verhalten, ich weiß nicht, ob es ein Fehler oder wie beabsichtigt ist.

3

Zuerst sollte editActionsForRowAtIndexPath nil und nicht [] zurückgeben, wenn keine Aktionen vorhanden sind.

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? 
{ 
    if mydata[indexPath.row].EditAvailable() 
    { 
     var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler) 
     return [editAction] 
    } 
    else 
    { 
     return nil 
    } 
} 

Zweitens müssen Sie editingStyleForRowAtIndexPath implementieren den Standard „Löschen“ Aktion für die anderen Reihen zu deaktivieren.

func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { 
    if mydata[indexPath.row].EditAvailable() { 
     return UITableViewCellEditingStyle.Delete 
    } 
    return UITableViewCellEditingStyle.None 
} 

Dank luciano für die Spitze leere Array/nil Spitze

6

Vermeiden vorbei leeren Arrays an -

Tableview editActionsForRowAtIndexPath

besser tun, um die Bedingungsprüfung in -

Tableview canEditRowAtIndexPath

Format Code wie folgt:

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
     if mydata[indexPath.row].EditAvailable() { 
      return true 
     } 
     return false 
    } 

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? 
    { 
     var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler) 
     return [editAction] 
    } 
+1

+1 dafür. Groß. Meine App stürzt ab, wenn Sie ein leeres Array in 'tableView editActionsForRowAtIndexPath' übergeben. Ich denke, dass es Sinn macht, denn ** edit ** bedeutet, dass etwas zum Bearbeiten vorhanden sein sollte. Danke noch einmal. – Ron

2

In iOS9.3 "canEditRowAtIndexPath" funktioniert nicht !!!

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath; 

Also funktioniert der folgende Code für mich. Es sollten nur zwei Methoden implementiert werden.

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(//not editable){ 
     return nil; 
    } 
    return @[//your actions]; 
} 

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if(//not editable){ 
     return UITableViewCellEditingStyleNone; 
    } 
    return UITableViewCellEditingStyleDelete; 
} 
+0

Yeah bemerkte das auch, Apple du machst das? – andromedainiative