SoundShock
SoundShock

Reputation: 485

Going back from a UIViewController to the first ViewController

The issue at hand is the following: I show a UIAlertController. If the user presses delete, the view should go back to the first page, which is of the class class TableViewQuery: PFQueryTableViewController.

import UIKit

class DetailViewController: UIViewController {

    var currentObject : PFObject?


           @IBAction func pressDelete(sender: AnyObject) {

                let deleteUser = UIAlertController(title: "Are you sure?", message: "Are you sure you want to delete the current user?", preferredStyle: UIAlertControllerStyle.Alert)
                deleteUser.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action: UIAlertAction) -> Void in

                    // Unwrap current object
                    if let object = self.currentObject {
                        object["firstName"] = self.firstName.text
                        object["lastName"] = self.lastName.text            
                        object.deleteEventually()   
                    }

            }))
            deleteUser.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction) -> Void in
                //Do nothing
            }))


            presentViewController(deleteUser, animated: true, completion: nil)        
    }

I have tried self.dismissViewControllerAnimated(true, completion: nil), but that just closes the UIAlertController.

I also tried the unwind segue, but then it does that instantly when I press the button, instead of showing the UIAlertController.

I also tried the segueForUnwindingToViewController(<toViewController: UIViewController:UIViewController>, fromViewController: <#T##UIViewController#>, identifier: <#T##String?#>) BUT my toViewController isn't a UIViewController, but a PFQueryTableViewController.

Any ideas on what else I can try?

Upvotes: 2

Views: 119

Answers (2)

John Wong
John Wong

Reputation: 352

You should put code into handler of UIAlertAction to respond when user click YES. I guess your are using master detail view controllers. If so, you need to find the right navigation controller to pop. Else, If you are using navigation controller, just pop as the code I commented.

    @IBAction func pressDelete(sender: AnyObject) {
    let deleteUser = UIAlertController(title: "Are you sure?", message: "Are you sure you want to delete the current user?", preferredStyle: UIAlertControllerStyle.Alert)
    deleteUser.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action: UIAlertAction) -> Void in
        // If you are using master detail view controllers
        if let navController = self.splitViewController?.viewControllers[0] as? UINavigationController {
            navController.popViewControllerAnimated(true)
        }
        // If you using navigation controller
        // self.navigationController?.popViewControllerAnimated(true)
    }))
    deleteUser.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction) -> Void in
        //Do nothing
    }))


    presentViewController(deleteUser, animated: true, completion: nil)
}

Upvotes: 1

Peter Hornsby
Peter Hornsby

Reputation: 4266

You should use the completion handler for presentViewController. You may need to keep track of any action the user took with the alert view controller. You will have to keep track of your user's choices with the alert view controller actions. Then in the completion handler check the user's choice and then make your navigation accordingly.

var didTapDeleteButton = false

       @IBAction func pressDelete(sender: AnyObject) {

            let deleteUser = UIAlertController(title: "Are you sure?", message: "Are you sure you want to delete the current user?", preferredStyle: UIAlertControllerStyle.Alert)
            deleteUser.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action: UIAlertAction) -> Void in

                // Unwrap current object
                if let object = self.currentObject {
                    object["firstName"] = self.firstName.text
                    object["lastName"] = self.lastName.text            
                    object.deleteEventually()

                    didTapDeleteButton = true   
                }

        }))
        deleteUser.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction) -> Void in
            didTapDeleteButton = false
        }))

        presentViewController(viewController, animated: true, completion: {

            // Make navigation choice here
            if didTapDeleteButton == true {
                // Navigation option 1
            } else {
                // Navigation option 2 
            }

        })

Upvotes: 1

Related Questions