Wischen Sie zu Löschen und die Schaltfläche "Mehr" (wie in der Mail-App unter iOS 7)


Answers

Ich habe eine neue Bibliothek erstellt, um swippable Tasten zu implementieren, die eine Vielzahl von Übergängen und erweiterbaren Tasten wie iOS 8 Mail App unterstützt.

https://github.com/MortimerGoro/MGSwipeTableCell

Diese Bibliothek ist kompatibel mit all den verschiedenen Möglichkeiten, eine UITableViewCell zu erstellen, und sie wurde unter iOS 5, iOS 6, iOS 7 und iOS 8 getestet.

Hier ein Beispiel einiger Übergänge:

Grenzübergang:

Clipübergang

3D-Übergang:

Question

So erstellen Sie eine "mehr" -Schaltfläche, wenn Benutzer eine Zelle in der Tabellenansicht durchstreichen (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 nicht finden und hoffe, dass mir jemand, der schlauer ist als ich, eine Lösung geben kann.

Ich möchte das, wenn der Benutzer eine Tabellensichtzelle durchsucht, um mehr als eine Bearbeitungsschaltfläche anzuzeigen (die Standardeinstellung ist die Löschschaltfläche). In der Mail-App für iOS 7 können Sie zum Löschen streichen, aber es gibt eine Schaltfläche "MEHR", die angezeigt wird.




Johnnys Antwort ist die richtige, um etwas zu sagen. Ich füge das unten in Ziel-c hinzu, um es Anfängern (und denen von uns, die sich weigern, Swift-Syntax zu lernen) klarer zu machen :)

Stellen Sie sicher, dass Sie das uitableviewdelegate deklarieren und über die folgenden Methoden verfügen:

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

    return @[button, button2]; //array with all the buttons you want. 1,2,3, etc...
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES; //tableview must be editable or nothing will work...
    }



Ich hoffe, Sie können nicht warten, bis Apple Ihnen gibt, was immer Sie brauchen, richtig? Also hier ist meine Option.

Erstellen Sie eine benutzerdefinierte Zelle. Hab zwei Uiviews drin

1. upper
2. lower

Fügen Sie in der unteren Ansicht die Schaltflächen hinzu, die Sie benötigen. Vergeben Sie ihre Aktionen wie alle anderen IBActions. Sie können die Animationszeit, Stil und alles entscheiden.

Fügen Sie nun der oberen Ansicht eine uiswipegesture hinzu und zeigen Sie Ihre untere Ansicht der Wischgeste an. Ich habe das schon getan und es ist die einfachste Option für mich.

Hoffe diese Hilfe.




Das 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 (zB MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) erkennen Swipes mit Gestenerkennung, einige davon (zB SWTableViewCell ) setzen ein zweites UISScrollView unter das Standard UITableViewCellScrollView (private Untersicht von UITableViewCell ) und einige verändern das Verhalten von UITableViewCellScrollView .

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 eine von links nach rechts gerichtete Schwenkfunktion benötigen, ob Sie iOS 6-Kompatibilität benötigen usw.). UITableViewCell Sie auch, dass die meisten dieser Ansätze mit einer Last verbunden sind: Sie können leicht in eine zukünftige iOS-Version einbrechen, wenn Apple Änderungen in der UITableViewCell Unteransicht-Hierarchie vornimmt.




Swift 3 Versionscode ohne Verwendung einer Bibliothek:

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]
    }

}



DIES KÖNNTE IHNEN HELFEN.

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

    return @[button, button2]; //array with all the buttons you want. 1,2,3, etc...
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES; //tableview must be editable or nothing will work...
    }



Aktuelle Swift 3 Antwort

Dies ist die EINZIGE Funktion, die Sie benötigen. Sie benötigen CanEdit- oder CommitEditingStyle-Funktionen für benutzerdefinierte Aktionen nicht.

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let action1 = UITableViewRowAction(style: .default, title: "Action1", handler: {
        (action, indexPath) in
        print("Action1")
    })
    action1.backgroundColor = UIColor.lightGray
    let action2 = UITableViewRowAction(style: .default, title: "Action2", handler: {
        (action, indexPath) in
        print("Action2")
    })
    return [action1, action2]
}



Es gibt eine erstaunliche Bibliothek namens SwipeCellKit , die mehr Anerkennung erhalten sollte. Meiner Meinung nach ist es cooler als MGSwipeTableCell . Letzteres repliziert das Verhalten der Zellen der Mail-App nicht vollständig, SwipeCellKit hingegen. Guck mal




Ab iOS 11 ist dies in UITableViewDelegate öffentlich verfügbar. Hier ist ein Beispielcode:

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
    UIContextualAction *delete = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive
                                                                         title:@"DELETE"
                                                                       handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                           NSLog(@"index path of delete: %@", indexPath);
                                                                           completionHandler(YES);
                                                                       }];

    UIContextualAction *rename = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal
                                                                         title:@"RENAME"
                                                                       handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                           NSLog(@"index path of rename: %@", indexPath);
                                                                           completionHandler(YES);
                                                                       }];

    UISwipeActionsConfiguration *swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[rename, delete]];
    swipeActionConfig.performsFirstActionWithFullSwipe = NO;

    return swipeActionConfig;
}

Auch verfügbar:

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;

Docs: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc




Swift 4 & iOs 11+

@available(iOS 11.0, *)
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

    let delete = UIContextualAction(style: .destructive, title: "Delete") { _, _, handler in

        handler(true)
        // handle deletion here
    }

    let more = UIContextualAction(style: .normal, title: "More") { _, _, handler in

        handler(true)
        // handle more here
    }

    return UISwipeActionsConfiguration(actions: [delete, more])
}