Morgoth
Morgoth

Reputation: 65

delete tableViewCell on long press

I currently have a sidebar menu in an iOS 9.2 app running on Xcode 7.2 written in Swift 2 that allows the user what data to load to populate the view. I'm using SWRevealViewController to create that sidebar. I have a container view controller which has the front page and the sidebar page listing all the options the user has. Each time the user selects a cell from the sidebar table, it performs a segue that allows the front page to be refreshed. What I want to do is to allow the user to delete a cell from the table with a long press. I'd like to show an AlertViewController to confirm the user's decision, and if "Yes" is selected, I want to delete the cell, and select the very first item in the table. I've tried following the instructions from Long press on UITableView but I keep getting the error "unrecognized selector sent to instance"

Here's the code that I'm using for setting up the gestureRecognizer in the cellForRowAtIndexPath function:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell;
    cell.textLabel!.text = tableArray[indexPath.row];
    let holdToDelete = UILongPressGestureRecognizer(target: cell, action: "longPressDelete");
    holdToDelete.minimumPressDuration = 1.00;
    cell.addGestureRecognizer(holdToDelete);
    return cell;
}

And here's the longPressDelete function:

func longPressDelete(sender: UILongPressGestureRecognizer) {
    let alert: UIAlertController = UIAlertController(title: "Please Confirm", message: "Are you sure you want to delete this car from your database?", preferredStyle: .Alert);
    alert.addAction(UIAlertAction(title: "Yes", style: .Destructive, handler: { (UIAlertAction) -> Void in
        if let tv = self.tableView {
            let point: CGPoint = sender.locationInView(self.tableView);
            let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(point)!;
            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade);
            NSUserDefaults.standardUserDefaults().removeObjectForKey("fillUp" + tableArray[indexPath.row]);
            NSUserDefaults.standardUserDefaults().removeObjectForKey("services" + tableArray[indexPath.row]);
            tableArray.removeAtIndex(indexPath.row);
            NSUserDefaults.standardUserDefaults().setObject(tableArray, forKey: "cars");
            self.deleted = true;
            self.performSegueWithIdentifier("tableToDashboard", sender: self);

        }
    }));
    alert.addAction(UIAlertAction(title: "No", style: .Default, handler: nil));
    self.presentViewController(alert, animated: true, completion: nil);
}

Here's the prepareForSegue function:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (deleted) {
        let indexPath: NSIndexPath = NSIndexPath(forRow: 0, inSection: 0);
        fillUpKey = "fillUp" + tableArray[indexPath.row];
        servicesKey = "services" + tableArray[indexPath.row];
        localFillUpArray = [fillUp]();
    } else {
        let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow!;
        fillUpKey = "fillUp" + tableArray[indexPath.row];
        servicesKey = "services" + tableArray[indexPath.row];
        localFillUpArray = [fillUp]();
    }
}

What I'd like to happen is that the user deletes the item in the cell, and the app then performs a segue to the front screen after loading the information from another source. Thanks for taking the time to read this and possibly provide an answer. I hope I haven't made a rookie mistake somewhere.

Upvotes: 4

Views: 6611

Answers (2)

Vishal Kamboj
Vishal Kamboj

Reputation: 5

Very simple example if you want to select cell in uitableview

let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longTap))
cell.addGestureRecognizer(longGesture)


 // longTap

 func longTap(gestureReconizer: UILongPressGestureRecognizer) {

    print("Long tap")

    let longPress = gestureReconizer as UILongPressGestureRecognizer
    _ = longPress.state
    let locationInView = longPress.location(in: tableview)
    let indexPath = tableview.indexPathForRow(at: locationInView)
 // whatever you want with indexPath use it //

 }       

Upvotes: 0

SwiftArchitect
SwiftArchitect

Reputation: 48514

Incorrect Selector

let holdToDelete = UILongPressGestureRecognizer(target: self,
                                                action: "longPressDelete:");
  • : after longPressDelete indicates that the method func longPressDelete(sender: UILongPressGestureRecognizer) actually accepts parameters.

  • self for target, assuming that the selector belongs to the same class that registered it.

The current selector "longPressDelete" would match a method signature without parameters:

func longPressDelete() { }

Upvotes: 1

Related Questions