winston
winston

Reputation: 3100

How to send user info to view controller with segue in swift?

I'm following along a tutorial and I'd like to expand on on the functionality a bit. I currently have a view controller that allows the user to browse through other users using a Parse query. When the user swipes at a user image I'd like to be able to send the selected user info to a new controller. I know I have to use prepareSegue but I'm not sure how to send that selected user information to a variable in that prepareSeque method.

Here's the view controller. The user I'd like to send to the segue method is labeled "Chosen" below in the wasDragged method:

import UIKit

class SwipeViewController: UIViewController {


    var xFromCenter: CGFloat = 0

    var usernames = [String]()
    var userImages = [NSData]()
    var currentUser = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        println(PFUser.currentUser()["first_name"])

        PFGeoPoint.geoPointForCurrentLocationInBackground { (geopoint: PFGeoPoint!, error: NSError!) -> Void in

            println(error)

            if error == nil {

                println(geopoint)

                var user = PFUser.currentUser()

                user["location"] = geopoint


                var query = PFUser.query()
                query.whereKey("location", nearGeoPoint:geopoint)

                query.limit = 10
                query.findObjectsInBackgroundWithBlock({ (users, error) -> Void in

                    var accepted = [String]()

                    if PFUser.currentUser()["accepted"] != nil {

                       accepted = PFUser.currentUser()["accepted"] as [String]

                    }

                    var rejected = [String]()

                    if PFUser.currentUser()["rejected"] != nil {

                       rejected = PFUser.currentUser()["rejected"] as [String]

                    }

                    for user in users {

                        var gender1 = user["gender"] as? NSString
                        var gender2 = PFUser.currentUser()["interestedIn"] as? NSString

                        if gender1 == gender2 && PFUser.currentUser().username != user.username && !contains(accepted, user.username) && !contains(rejected, user.username) {

                            self.usernames.append(user.username)

                            // Update - chaned as to as!

                            self.userImages.append(user["image"] as NSData)

                        }


                    }

                    var userImage: UIImageView = UIImageView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
                    println("images:")
                    println(userImage)
                    println(self.userImages)

                    userImage.image = UIImage(data: self.userImages[0])
                    userImage.contentMode = UIViewContentMode.ScaleAspectFit
                    self.view.addSubview(userImage)

                    var gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
                    userImage.addGestureRecognizer(gesture)

                    userImage.userInteractionEnabled = true



                })

                user.save()

            }

        }






    }

    func wasDragged(gesture: UIPanGestureRecognizer) {



        let translation = gesture.translationInView(self.view)
        var label = gesture.view!

        xFromCenter += translation.x

        var scale = min(100 / abs(xFromCenter), 1)

        label.center = CGPoint(x: label.center.x + translation.x, y: label.center.y + translation.y)

        gesture.setTranslation(CGPointZero, inView: self.view)

        var rotation:CGAffineTransform = CGAffineTransformMakeRotation(xFromCenter / 200)

        var stretch:CGAffineTransform = CGAffineTransformScale(rotation, scale, scale)

        label.transform = stretch

        if label.center.x < 100 {

            println("Not Chosen")

            PFUser.currentUser().addUniqueObject(self.usernames[self.currentUser], forKey: "rejected")
            PFUser.currentUser().save()

            self.currentUser++

        } else if label.center.x > self.view.bounds.width - 100 {

             //SEND THIS USER TO NEW CONTROLLER
            println("Chosen")

            PFUser.currentUser().addUniqueObject(self.usernames[self.currentUser], forKey: "accepted")
            PFUser.currentUser().save()

            //self.currentUser++

            performSegueWithIdentifier("startGame", sender: nil)

            return

        }

        if gesture.state == UIGestureRecognizerState.Ended {


            label.removeFromSuperview()

            if self.currentUser < self.userImages.count {

                var userImage: UIImageView = UIImageView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
                userImage.image = UIImage(data: self.userImages[self.currentUser])
                userImage.contentMode = UIViewContentMode.ScaleAspectFit
                self.view.addSubview(userImage)

                var gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
                userImage.addGestureRecognizer(gesture)

                userImage.userInteractionEnabled = true

                xFromCenter = 0

            } else {

                println("No more users")

            }

        }
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        //var user = ?? I want to send this user info to the segue to GameViewController

        let destinationVC = segue.destinationViewController as GameViewController
    }


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


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    }
    */

}

Any help would be greatly appreciated. Thanks!

Upvotes: 0

Views: 573

Answers (2)

chrissukhram
chrissukhram

Reputation: 2967

You should have a user variable in your GameViewController class and in your prepareForSegue function set it to the user that was swiped.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "startGame") {
        let destinationVC = segue.destinationViewController as GameViewController
        destinationVC.user = self.currentUser; //or whatever variables you want to set
    }
}

I have included code to check if the segue is a "startGame" segue in case you wanted to have other segues which do not pass a user.

Upvotes: 1

rdelmar
rdelmar

Reputation: 104092

Instead of passing nil for the sender argument in performSegueWithIdentifier:sender: you can pass "Chosen". You can pass any object you want in that parameter. It will then be the sender argument in prepareForeSegue:sender:

Upvotes: 0

Related Questions