Search code examples
iosswiftuitableviewuitableviewrowaction

Why can't I see my TableViewRowActions buttons (in swift)?


I would like to implements the swipe movement on all my cells in my tableview. After reading 4 different tutorials, I don't understand why my action buttons don't appear : I can do the "swipe", I can see a blank space where the buttons supposed to be. Even my handlers are not called on click...

class RestaurantsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var mTableView: UITableView!

private var restosList = [Restaurant]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.mTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

    let url = "http://xxxxxxxxxx"
    Alamofire.request(.GET, url, parameters: ["service" : "restaurants"])
        .responseArray { (response: [Restaurant]?, error: NSError?) in
            if let response = response {
                for oneResto in response {
                    self.restosList.append(oneResto)
                }
            }
            self.mTableView.reloadData()
    }

}

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell = self.mTableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell

    cell.textLabel?.text = self.restosList[indexPath.row].nom

    return cell
}

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

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var alert:UIAlertView = UIAlertView()
    alert.title = self.restosList[indexPath.row].description
    alert.addButtonWithTitle("OK")
    alert.show()

    self.mTableView.deselectRowAtIndexPath(indexPath, animated: true)
}

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {

    let deleteClosure = { (action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void in
        println("Delete closure called")
    }

    let moreClosure = { (action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void in
        println("More closure called")
    }

    let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: deleteClosure)
    let moreAction = UITableViewRowAction(style: .Normal, title: "More", handler: moreClosure)

    return [deleteAction, moreAction]
}

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    // Intentionally blank. Required to use UITableViewRowActions
}

Solution

  • Add the canEditRowAtIndexPath method to your view controller and return true.

    I usually put my handler code in as a closure right into the parameter but I don't think that should make a difference.

    Here's the code:

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    var myItems = ["Item 1","Item 2","Item 3"]
    
    @IBOutlet weak var myTable: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
    
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    
        cell.textLabel?.text = myItems[indexPath.row]
    
        return cell
    
    }
    
    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return true
    }
    
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        // Okie dokie
    }
    
    func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
    
    
        let editAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Edit", handler: {
    
            Void in
    
            println("edit swipe")
    
        })
    
        let superAction = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "Super", handler: {
    
            Void in
    
            println("super swipe")
    
        })
    
        return [editAction, superAction]
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    }
    

    enter image description here