Swipe-fähige Tabellenansichtszelle in iOS 9

83

Ich möchte, dass meine Tabellenliste ein wischbares Menü wie in iOS 8 enthält (erstmals in iOS 7 eingeführt).

Screenshot der Zellenaktionsschaltflächen der Tabellenansicht

Ich habe einen Ray Wenderlich-Leitfaden gefunden, in dem klar ist, wie es geht, aber er wurde vor einem Jahr und 4 Monaten geschrieben und der Code befindet sich in Objective-C.

Hat iOS 8 oder das kommende iOS 9 diese Funktion endlich in Apples SDK aufgenommen? Ich weiß, dass sie vor Jahren die integrierte Funktion "Streichen, um die Löschfunktion aufzudecken" erstellt haben. Ich möchte meine Zeit nicht damit verschwenden, zusammengefügten Code zu implementieren, um die E-Mail-Funktion von iOS 8 nachzuahmen, wenn Apples neues iOS ihn mir in einem ordentlich verpackten Paket übergibt.

Dave G.
quelle
2
Hat jemand in Swift eine Lösung für das Wischen von links nach rechts gefunden? Von rechts nach links scheint gut dokumentiert und diskutiert, aber nicht von links nach rechts.
Atticus

Antworten:

159

Versuche dies. (Aktualisiert für Swift 3.0) ( Entwicklerdokumente )

override func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? {
    let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
        print("more button tapped")
    }
    more.backgroundColor = .lightGray

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
        print("favorite button tapped")
    }
    favorite.backgroundColor = .orange

    let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
        print("share button tapped")
    }
    share.backgroundColor = .blue

    return [share, favorite, more]
}

Implementieren Sie auch Folgendes: (Sie können es bedingt machen, aber hier kann alles bearbeitet werden)

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

(Ältere Version)

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        let more = UITableViewRowAction(style: .Normal, title: "More") { action, index in
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGrayColor()

        let favorite = UITableViewRowAction(style: .Normal, title: "Favorite") { action, index in
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orangeColor()

        let share = UITableViewRowAction(style: .Normal, title: "Share") { action, index in
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blueColor()

        return [share, favorite, more]
    }

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // the cells you would like the actions to appear needs to be editable
        return true
    }
jose920405
quelle
11
Dies beantwortet die Frage nicht. Wir versuchen mit swift einen Ausweg nach links zu finden. Das geht nicht
Somu
Vielen Dank! Dies hat offensichtlich nicht mit dem Wischen von links nach rechts zu tun gehabt, aber ich habe beschlossen, diese Funktion trotzdem aufzugeben. Das einzige, was nicht klar ist, ist, wie die Tabelle nach dem Drücken einer Schaltfläche, mit der die Zelle möglicherweise verschoben / gelöscht wird, automatisch aktualisiert wird.
Dave G
1
Weiß nicht, ob du meinst tableview.reloadRowsAtIndexPaths ([indexpath] withRowAnimation: UITableViewRowAnimation.Automatic)und zum Löschentableview.deleteRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
jose920405
2
Ist es möglich, die Aktion "Bearbeiten" zu öffnen, indem Sie auf die Zelle tippen, anstatt sie zu wischen?
Heysem Katibi
1
Swift 3 Funktionsdefinitionoverride func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
David Corbin
28

Dieser Code ist Arbeit für mich in der swift4.

Geben Sie hier die Bildbeschreibung ein

Die Antwort des obigen Bildschirms lautet: -

 func tableView(_ tableView: UITableView,
                   trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {
        // Write action code for the trash
        let TrashAction = UIContextualAction(style: .normal, title:  "Trash", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        TrashAction.backgroundColor = .red

        // Write action code for the Flag
        let FlagAction = UIContextualAction(style: .normal, title:  "Flag", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        FlagAction.backgroundColor = .orange

        // Write action code for the More
        let MoreAction = UIContextualAction(style: .normal, title:  "More", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        MoreAction.backgroundColor = .gray


        return UISwipeActionsConfiguration(actions: [TrashAction,FlagAction,MoreAction])
    }

Geben Sie hier die Bildbeschreibung ein

Antwort des obigen Bildschirms: -

 func tableView(_ tableView: UITableView,
                   leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {

        let closeAction = UIContextualAction(style: .normal, title:  "Mark as Read", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("CloseAction ...")
            success(true)
        })
        closeAction.backgroundColor = .blue
        return UISwipeActionsConfiguration(actions: [closeAction])

    }

Tabellenansicht schreiben Delegate-Methode ebenfalls: -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPerson.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let personName = arrPerson[indexPath.row]
        cell.textLabel?.text = personName.personName
        return cell

    }

Und in der viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    tblView.delegate = self
    tblView.dataSource = self

    let person1 = personData(personName: "Jonny", personAge: 30)
    let person2 = personData(personName: "Chandan", personAge: 20)
    let person3 = personData(personName: "Gopal", personAge: 28)

   arrPerson.append(person1)
   arrPerson.append(person2)
   arrPerson.append(person3)

}
Niraj Paul
quelle
7
Hat nur 3 Jahre
gedauert
2
Es ist für iOS 11+
cdub
21

Sie können eine UITableView-Delegatmethode verwenden, um nach diesen Aktionen zu fragen. Implementieren Sie diese Methode wie folgt:

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewRowAction *modifyAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Modify" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
         // Respond to the action.
     }];
     modifyAction.backgroundColor = [UIColor blueColor];
     return @[modifyAction];
}

Sie können natürlich mehrere Aktionen zurückgeben und den Text und die Hintergrundfarbe anpassen.

Die Implementierung dieser Methode ist auch erforderlich, um die Zeile bearbeitbar zu machen:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}
BalestraPatrick
quelle
Ich kann all diese Funktionen mit nur einem Dutzend Codezeilen erhalten. Oder Sie sagen nur, dass Sie den Code, den ich letztendlich benutze, in diese Funktion einfügen sollen. Keiner der angegebenen Codes sieht so aus, als würde er die Zelle verändern. Versuchen Sie auch, dies in Swift zu beheben.
Dave G
Ja, Sie können alle Funktionen nur mit diesem Code erhalten. Es ist eine integrierte Funktion. Wow, das ist sogar die richtige Antwort und jemand hat sie abgelehnt. Ich bin überrascht.
BalestraPatrick
Beachten Sie, dass dies seit iOS8 + verfügbar ist und NUR das Wischen nach links ermöglicht. Sie müssen eine benutzerdefinierte Implementierung vornehmen, um nach rechts wischen zu können.
Davon abgesehen auch eine
Vielen Dank für das Teilen. Wenn ich zu inkompetent bin, um das vollständige Menü zu implementieren, kann ich diese einfachere Lösung verwenden. Ich habe es positiv bewertet, da es relevant ist, aber ich kann es nicht als Antwort auswählen, da es nicht die Frage beantwortet, wie das vollständige iOS8 Mail-Menü nachgeahmt werden kann, und es ist in Ziel-C geschrieben.
Dave G
15

Ich fand diese Bibliothek MGSwipeTableCell Nachdem ich viel gesucht hatte, um eine Folienzelle in der Tabellenansicht mit Swift zu implementieren, fand ich diese und nur eine Codezeile für die Implementierung und fand sie äußerst nützlich.

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
  {
    let reuseIdentifier = "programmaticCell"
    var cell = self.table.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
    if cell == nil
    {
      cell = MGSwipeTableCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier)
    }

    cell.textLabel!.text = "Title"
    cell.detailTextLabel!.text = "Detail text"
    cell.delegate = self //optional

    //configure left buttons
    cell.leftButtons = [MGSwipeButton(title: "", icon: UIImage(named:"check.png"), backgroundColor: UIColor.greenColor())
      ,MGSwipeButton(title: "", icon: UIImage(named:"fav.png"), backgroundColor: UIColor.blueColor())]
    cell.leftSwipeSettings.transition = MGSwipeTransition.Rotate3D

    //configure right buttons
    cell.rightButtons = [MGSwipeButton(title: "Delete", backgroundColor: UIColor.redColor())
      ,MGSwipeButton(title: "More",backgroundColor: UIColor.lightGrayColor())]
    cell.rightSwipeSettings.transition = MGSwipeTransition.Rotate3D

    return cell
  }

Dies ist die einzige Funktion, die Sie zum Implementieren und Aktualisieren Ihrer Pod-Datei benötigen

Somu
quelle
11

Swift 3 Komplettlösung:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.tableFooterView = UIView(frame: CGRect.zero) //Hiding blank cells.
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }

    //Enable cell editing methods.
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
            //self.isEditing = false
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGray

        let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
            //self.isEditing = false
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            //self.isEditing = false
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue

        return [share, favorite, more]
    }

}
mriaz0011
quelle
2

AFAIK gibt es keine integrierte Ready-to-Go-Lösung, und selbst wenn es iOS9 gab, können Sie sie wahrscheinlich nicht verwenden, da Sie iOS9 in Ihrer App auf absehbare Zeit nicht nur unterstützen können.

Stattdessen empfehle ich Ihnen, in diese Bibliothek zu schauen:

https://github.com/CEWendel/SWTableViewCell

Es ist sehr einfach zu konfigurieren, ziemlich poliert und hat in jedem schnellen Projekt, an dem ich gearbeitet habe, gut funktioniert.

Ich hoffe es hilft!

Jiri Trecak
quelle
Vielen Dank. Neu in der Entwicklung und noch nie zuvor GitHub verwendet. Ich habe gerade die Zip-Datei heruntergeladen und das Projekt in X-Code geöffnet und dann das Projekt ausgeführt, aber "Build Failed" erhalten. Muss ich den Code in mein Projekt einbinden, bevor ich sehen kann, wie er funktioniert?
Dave G
Sie sollten Cocoapods besser als Abhängigkeitsmanager installieren. Es ist Industriestandard und erspart Ihnen viel Kopfschmerzen. Mehr über Cocoapods und wie man es benutzt cocoapods.org
Jiri Trecak
Danke Jiri, nachdem ich kurz über CocoaPods gelesen habe, klingt es so, als müsste ich heute Abend weiter lesen, um sie zu verstehen. Ich wurde eifrig und anstatt das Github-Projekt auszuführen, fing ich gerade an, den Code zu betrachten. Es ist in Ziel-C! Meine App ist in Swift und das ist die Sprache, die ich kenne. Müsste ich die Github-Lösung in Swift übersetzen oder könnte ich den Objective-C ViewController-Code in meinen BasicCellViewController kopieren, da sie nebeneinander ausgeführt werden können?
Dave G
Mit Cocoapods führen Sie Bibliotheken nebeneinander, Ziel C und schnell aus, wenn Sie iOS8 + verwenden. Dann können Sie nahtlos Obj-C - Code in Ihrem schnellen Projekt verwenden (aber es wird unter „Pods“ Projekt ausgeblendet werden), das einzige , was Sie tun müssen, ist der Import Objective-C - Bibliothek in Ihrem „Bridging Header“ developer.apple.com / Bibliothek / Vorabversion / ios / Dokumentation / Swift /…
Jiri Trecak
Lesen Sie einfach über CocoaPods ( raywenderlich.com/97014/use-cocoapods-with-swift ), ich denke, das ist zu viel für mein Gehirn, um daran zu kauen. Ich bekomme das Konzept, implementiere es aber im Terminal, verwende Arbeitsbereiche, lasse meine App auf Code laufen, der nicht mit meinem anderen Code zusammengeführt wurde ... und optimiere die eigentliche Menüfunktion, um zu sehen / zu handeln, wie ich es auch will ... mein Gehirn würde es tun explodieren. Ich werde untersuchen, wie ich dieses Objekt einfach einfügen und meiner App mitteilen würde, dass ich beide Sprachen verwende. Ich habe das noch nie gemacht, aber es scheint einfacher zu sein
Dave G
1

Es ist einfacher als du denkst. Hier ist ein Beispiel für eine Swift-Klasse mit einer implementierten UITableView und der Möglichkeit, UITableViewCell zu wischen.

import UIKit

class ViewController: UIViewController {

    // MARK: Properties

    let strings = ["firstString", "secondString", "thirdString"]

    // MARK: Outlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    // MARK: UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
        let currentString = strings[indexPath.row]
        cell.textLabel?.text = currentString
        return cell
    }

    // MARK: UITableViewDelegate

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }

    func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let leftAction = UIContextualAction(style: .normal, title:  "Red", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("leftAction tapped")
            success(true)
        })

        leftAction.image = UIImage(named: "")
        leftAction.backgroundColor = UIColor.red

        return UISwipeActionsConfiguration(actions: [leftAction])
    }

    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let rightAction = UIContextualAction(style: .normal, title:  "Green", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("rightAction tapped")
            success(true)
        })

        rightAction.image = UIImage(named: "")
        rightAction.backgroundColor = UIColor.green

        return UISwipeActionsConfiguration(actions: [rightAction])
    }

}
iAleksandr
quelle