So erstellen Sie eine Schaltfläche "Mehr", wenn der Benutzer eine Zelle in der Tabellenansicht wischt (wie die Mail-App in iOS 7).
Ich habe sowohl hier als auch im Cocoa Touch-Forum nach diesen Informationen gesucht, aber ich kann die Antwort scheinbar nicht finden und hoffe, dass jemand, der klüger ist als ich, mir eine Lösung geben kann.
Ich möchte, dass, wenn der Benutzer eine Tabellenansichtszelle wischt, mehr als eine Bearbeitungsschaltfläche angezeigt wird (standardmäßig ist die Löschschaltfläche). In der Mail-App für iOS 7 können Sie zum Löschen wischen, aber es wird eine Schaltfläche "MEHR" angezeigt.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
quelle
quelle
Antworten:
Implementierung
Es sieht so aus, als würde iOS 8 diese API öffnen. Hinweise auf solche Funktionen sind in Beta 2 enthalten.
Um etwas zum Laufen zu bringen, implementieren Sie die folgenden zwei Methoden auf dem Delegierten von UITableView, um den gewünschten Effekt zu erzielen (ein Beispiel finden Sie in der Übersicht).
Bekannte Probleme
In der Dokumentation heißt es: tableView: commitEditingStyle: forRowAtIndexPath lautet:
Das Wischen funktioniert jedoch nicht ohne. Auch wenn der Methodenstub leer ist, wird er vorerst noch benötigt. Dies ist offensichtlich ein Fehler in Beta 2.
Quellen
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Ursprüngliche Antwort: https://stackoverflow.com/a/24540538/870028
Aktualisieren:
Beispielcode mit dieser Funktion (In Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
Der Beispielcode enthält diese einfach zu verfolgende Methode in MasterViewController.swift. Mit nur dieser Methode erhalten Sie das im OP-Screenshot gezeigte Verhalten:
quelle
tableView.editing = false
(NO
in objc) und die Zelle wird "geschlossen".Ich habe eine neue Bibliothek erstellt, um swippbare Schaltflächen zu implementieren, die eine Vielzahl von Übergängen und erweiterbaren Schaltflächen wie die iOS 8-Mail-App unterstützen.
https://github.com/MortimerGoro/MGSwipeTableCell
Diese Bibliothek ist mit all den verschiedenen Möglichkeiten zum Erstellen einer UITableViewCell kompatibel und wurde unter iOS 5, iOS 6, iOS 7 und iOS 8 getestet.
Hier ein Beispiel einiger Übergänge:
Grenzübergang:
Clip-Übergang
3D-Übergang:
quelle
Johnnys Antwort ist die richtige, um zu stimmen. Ich füge dies unten in Ziel-c hinzu, um es Anfängern (und denen von uns, die sich weigern, die Swift-Syntax zu lernen) klarer zu machen :)
Stellen Sie sicher, dass Sie das uitableviewdelegate deklarieren und über die folgenden Methoden verfügen:
quelle
Dies ist (ziemlich lächerlich) eine private API.
Die folgenden zwei Methoden sind privat und werden an den Delegierten von UITableView gesendet:
Sie sind ziemlich selbsterklärend.
quelle
Um Johnnys Antwort zu verbessern, kann dies jetzt mithilfe der öffentlichen API wie folgt durchgeführt werden:
quelle
Ich hoffe, Sie können es kaum erwarten, bis Apple Ihnen alles gibt, was Sie brauchen, oder? Also hier ist meine Option.
Erstellen Sie eine benutzerdefinierte Zelle. Habe zwei Ansichten drin
Fügen Sie in der unteren Ansicht die gewünschten Schaltflächen hinzu. Behandeln Sie seine Aktionen wie alle anderen IBActions. Sie können die Animationszeit, den Stil und alles festlegen.
Fügen Sie nun der oberen Ansicht eine uiswipegesture hinzu und zeigen Sie Ihre untere Ansicht bei einer Wischgeste an. Ich habe dies schon einmal gemacht und es ist für mich die einfachste Option.
Hoffe das hilft.
quelle
Dies ist mit dem Standard-SDK nicht möglich. Es gibt jedoch verschiedene Lösungen von Drittanbietern, die das Verhalten in Mail.app mehr oder weniger imitieren. Einige von ihnen (z. B. MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) erkennen Wischbewegungen mithilfe von Gestenerkennern, andere (z. B. SWTableViewCell ) setzen eine zweite UISScrollView unter den Standard
UITableViewCellScrollView
(private Unteransicht vonUITableViewCell
) und einige ändern das Verhalten vonUITableViewCellScrollView
.Ich mag den letzten Ansatz am meisten, da sich das Touch-Handling am natürlichsten anfühlt. Insbesondere ist MSCMoreOptionTableViewCell gut. Ihre Auswahl kann je nach Ihren spezifischen Anforderungen variieren (ob Sie auch einen Schwenk von links nach rechts benötigen, ob Sie iOS 6-Kompatibilität benötigen usw.).
UITableViewCell
Beachten Sie auch, dass die meisten dieser Ansätze mit einer Belastung verbunden sind: Sie können in einer zukünftigen iOS-Version leicht beschädigt werden, wenn Apple Änderungen in der Subview-Hierarchie vornimmt.quelle
Swift 3-Versionscode ohne Verwendung einer Bibliothek:
quelle
Sie müssen eine Unterklasse
UITableViewCell
und eine Unterklassenmethode verwenden,willTransitionToState:(UITableViewCellStateMask)state
die aufgerufen werden, wenn der Benutzer die Zelle wischt. Diestate
Flags zeigen an, ob die Schaltfläche Löschen angezeigt wird, und zeigen dort die Schaltfläche Mehr an / aus.Leider gibt Ihnen diese Methode weder die Breite der Schaltfläche Löschen noch die Animationszeit. Sie müssen also den Frame und die Animationszeit Ihrer More-Schaltfläche beobachten und fest in Ihren Code codieren (ich persönlich denke, Apple muss etwas dagegen tun).
quelle
Für eine schnelle Programmierung
quelle
Dies könnte Ihnen helfen.
quelle
Ich wollte meiner App die gleiche Funktionalität hinzufügen, und nachdem ich so viele verschiedene Tutorials durchgesehen hatte ( raywenderlich ist die beste DIY-Lösung), fand ich heraus, dass Apple eine eigene
UITableViewRowAction
Klasse hat, was sehr praktisch ist.Sie müssen die Boilerpoint-Methode von Tableview folgendermaßen ändern:
Weitere Informationen hierzu finden Sie auf dieser Website . Apples eigene Dokumentation ist sehr nützlich, um die Hintergrundfarbe zu ändern:
Wenn Sie die Schriftart der Schaltfläche ändern möchten, ist dies etwas schwieriger. Ich habe einen anderen Beitrag auf SO gesehen. Um sowohl den Code als auch den Link bereitzustellen, ist hier der Code, den sie dort verwendet haben. Sie müssten das Erscheinungsbild der Schaltfläche ändern. Sie müssten einen spezifischen Verweis auf tableviewcell machen, sonst würden Sie das Erscheinungsbild der Schaltfläche in Ihrer App ändern (das wollte ich nicht, aber vielleicht, ich weiß nicht :))
Ziel c:
Schnell:
Dies ist meiner Meinung nach die einfachste und optimierteste Version. Ich hoffe es hilft.
Update: Hier ist die Swift 3.0-Version:
quelle
shareMenu.
nimmt keineaddAction
Methode. DankeAktuelle Swift 3 Antwort
Dies ist die EINZIGE Funktion, die Sie benötigen. Sie benötigen keine CanEdit- oder CommitEditingStyle-Funktionen für benutzerdefinierte Aktionen.
quelle
Ab iOS 11 ist dies öffentlich verfügbar in
UITableViewDelegate
. Hier ist ein Beispielcode:Auch verfügbar:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Dokumente: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
quelle
Swift 4 & iOs 11+
quelle
Ich habe tableViewCell verwendet , um mehrere Daten anzuzeigen. Nach dem Wischen () von rechts nach links in einer Zelle werden zwei Schaltflächen angezeigt. Genehmigen und ablehnen. Es gibt zwei Methoden: Die erste ist ApproveFunc, die ein Argument akzeptiert, und die andere ist RejectFunc, die ebenfalls nimmt ein Argument.
quelle
Hier ist eine etwas fragile Methode, die keine privaten APIs oder den Aufbau eines eigenen Systems umfasst. Sie sichern Ihre Wetten ab, dass Apple dies nicht bricht und dass hoffentlich eine API veröffentlicht wird, durch die Sie diese wenigen Codezeilen ersetzen können.
Dies erfordert auch, dass Sie die Standard-Rückrufe für die Bearbeitung von Delegaten in der Tabellenansicht implementieren.
quelle
Es gibt eine erstaunliche Bibliothek namens
SwipeCellKit
, die mehr Anerkennung finden sollte. Meiner Meinung nach ist es cooler alsMGSwipeTableCell
. Letzteres repliziert das Verhalten der Zellen der Mail-App nicht vollständigSwipeCellKit
. Guck malquelle
SwipeCellKit
und war beeindruckt ... bis ich eine dieser Ausnahmen bekam, weil die Anzahl der Zeilen vor einem Update der Tabellenansicht nicht die gleiche war wie nach dem Update +/- der Änderung der Zeilen. Die Sache ist, ich habe meinen Datensatz nie geändert. Wenn das nicht besorgniserregend ist, weiß ich nicht, was es ist. Also habe ich mich gegen die Verwendung entschieden und nur die neuen UITableViewDelegate-Methoden verwendet. Wenn Sie weitere Anpassungen benötigen, können Sie jederzeit überschreibenwillBeginEditingRowAt: ....
Swift 4
quelle
sourceView
ist "Die Ansicht, in der die Aktion angezeigt wurde." Weitere Informationen finden Sie unter "UIContextualAction.Handler".Hier ist eine einfache Lösung. Es ist in der Lage, benutzerdefinierte UIView in UITableViewCell anzuzeigen und auszublenden. Die Anzeigelogik ist in einer Klasse enthalten, die von UITableViewCell, BaseTableViewCell erweitert wurde.
BaseTableViewCell.h
BaseTableViewCell.M
Um diese Funktionalität zu erhalten, erweitern Sie einfach Ihre Tabellenansichtszelle von BaseTableViewCell.
Als Nächstes erstellt Inside UIViewController, das UITableViewDelegate implementiert, zwei Gestenerkenner für linke und rechte Wischbewegungen.
Fügen Sie dann zwei Swipe-Handler hinzu
In cellForRowAtIndexPath von UITableViewDelegate können Sie jetzt eine benutzerdefinierte UIView erstellen und an die aus der Warteschlange entfernte Zelle anhängen.
Diese Art des Ladens von benutzerdefiniertem UIView ist natürlich nur für dieses Beispiel. Verwalten Sie es wie Sie wollen.
quelle