【问题标题】:How to send user info to view controller with segue in swift?如何在 swift 中使用 segue 将用户信息发送到视图控制器?
【发布时间】:2015-03-13 02:15:06
【问题描述】:

我正在学习一个教程,我想稍微扩展一下功能。我目前有一个视图控制器,允许用户使用 Parse 查询浏览其他用户。当用户在用户图像上滑动时,我希望能够将选定的用户信息发送到新控制器。我知道我必须使用 prepareSegue,但我不确定如何将选定的用户信息发送到该 prepareSeque 方法中的变量。

这是视图控制器。我想发送到 segue 方法的用户在下面的 wasDragged 方法中标记为“Chosen”:

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.
    }
    */

}

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: ios xcode swift parse-platform


    【解决方案1】:

    您应该在 GameViewController 类中有一个用户变量,并在您的 prepareForSegue 函数中将其设置为被刷过的用户。

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

    我已经包含代码来检查转场是否是“startGame”转场,以防您想要其他不通过用户的转场。

    【讨论】:

    • 谢谢!我想这就是我一直在寻找的。我将用户设置为destinationVC.user = PFUser.currentUser().addUniqueObject(self.usernames[self.currentUser], forKey: "accepted"),但在线上出现错误:“Void”不可转换为 PFUser。我正在尝试从 wasDragged 方法中获取该特定用户。这个错误是什么意思?谢谢!
    • 您正在将用户设置为“addUniqueObject()”方法的结果,该方法返回 void。您需要将用户变量设置为返回用户的方法,我假设它是“PFUser.currentUser()”。
    • 我想我明白了!所以,segue 确实有效,但我仍然不确定如何调用在 SwipeViewController 中设置的destinationVC.user 变量。所以,假设我想在 GameViewController 中设置一个 label.text 以等于用户名。 GameViewController 是否可以访问destinationVC.user?
    • destinationVC 也是您正在转场的 GameViewController。在您的 prepareForSegue 方法中,您只是在呈现之前访问它。您事先访问它的原因是您可以设置它的一些变量(例如它的用户变量或 GameViewCont 具有的任何其他变量)。如果您想从当前 ViewController 设置标签文本,那么您想在 GameViewController 中创建一个名为“name”或其他内容的字符串变量,并在您的 prepareForSegue 方法中设置 destinationVC.name =“Text”,并在您的 GameViewController viewDidLoad 中将 uilabel 设置为那个字符串。
    • 您这样做是因为您不想直接在 prepareForSegue 中访问 UI,因为它尚未呈现。对不起,我在手机上。
    【解决方案2】:

    您可以传递“Chosen”,而不是在 performSegueWithIdentifier:sender: 中为 sender 参数传递 nil。您可以在该参数中传递您想要的任何对象。然后它将是 prepareForeSegue:sender: 中的 sender 参数:

    【讨论】:

    • 感谢您的快速回复!我是否需要在 prepareForSegue 中包含其他变量,还是会从选择的发件人那里得到它?一旦我解决了我刚刚在应用程序中发现的另一个问题,我就可以对其进行测试
    • @james,对不起,我想我看错了你的代码。您想传递当前用户,对吗?然后你应该通过 self.currentUser.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多