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 commitEditingStyle
Methode angegeben und auch die Editing-Eigenschaft auf YES gesetzt.
Die Wischfunktion kommt immer noch nicht.
Muss ich jetzt UISwipeGesture
jede Zelle separat hinzufügen ?
Oder fehlt mir etwas?
ios
uitableview
uiswipegesturerecognizer
Amogh Talpallikar
quelle
quelle
Antworten:
Sie müssen nicht festlegen,
editing:YES
ob beim Streichen der Zelle die Schaltfläche Löschen angezeigt werden soll. Sie müssentableView: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,UITableViewCellEditingStyleNone
wenn sich die Tabelle nicht im Bearbeitungsmodus befand.quelle
[tableView setEditing:YES];
?tableView:canEditRowAtIndexPath:
möglicherweise nicht ausreicht. Sie müssen auch implementierentableView:commitEditingStyle:forRowAtIndexPath
.Wie Dan oben kommentiert hat, müssen Sie die folgenden Delegatmethoden für Tabellenansichten implementieren:
tableView:canEditRowAtIndexPath:
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."); }
quelle
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
Methode nur implementieren , da die Bearbeitung standardmäßig JA sein sollte.// 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 } }
quelle
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] }
quelle
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); }
quelle
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.
quelle
Wenn Sie
NSFetchedResultsControllerDelegate
die Tabellenansicht mit a füllen, hat dies bei mir funktioniert:tableView:canEditRowAtIndexPath
return immer true isttableView:commitEditingStyle:forRowAtIndexPath
Lö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)") } }
quelle
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 } }
quelle
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
gesture
Fernsehgerät durch eine andere Geste im Controller der übergeordneten Ansicht blockiert wurde. Der Fernseher war in einemMMDrawerController
(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; }
quelle
Meiner Erfahrung nach müssen Sie
editing
amUITableView
Set sein,NO
damit das Wischen zur Arbeit geht.self.tableView.editing = NO;
quelle
Nach iOS 8.0 können Sie Ihre Aktion anpassen
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
quelle
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]; } }
quelle
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.
quelle