ios - 无法识别的选择器发送到 Swift 中的实例?

标签 ios swift

我的应用使用手势向左或向右滑动图片(我正在学习教程)。代码过去工作正常,但我认为在将 Xcode 更新到 7(从版本 6)后它坏了。当我滑动图片时,应用程序崩溃并显示以下消息:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[...... wasDragged:]:无法识别的选择器发送到实例

这似乎是 Swift 中的一个常见错误,有许多不同的原因可以解释为什么会发生这种情况。我确认我实际上是在 viewDidLoad 之外调用该函数,所以我不确定哪里出了问题:

override func viewDidLoad() {
    super.viewDidLoad()

    //start geolocation services

    PFGeoPoint.geoPointForCurrentLocationInBackground { (geopoint, error) -> Void in
        if let geopoint = geopoint {

            if let user = PFUser.currentUser() {
                // save the latest location for the user right away... this can continue
                // asynchronously in the background, we don't really care how long it takes.
                // You may still want to check for errors here, or even use the saveEventually method
                user["location"] = geopoint
                user.saveInBackgroundWithBlock(nil);


                let query:PFQuery=PFUser.query()!
                // check that we have a location for the user
                query.whereKeyExists("location")
                query.whereKey("location", nearGeoPoint: geopoint)

                // filtering for interests directly in the query. This way we don't need to retrieve all data and
                // then loop over it
                query.whereKey("gender", equalTo: user["interestedIn"]!)

                // exclude the current user
                query.whereKey("user", notEqualTo: user)

                query.limit = 10

                query.findObjectsInBackgroundWithBlock({ (users, error) -> Void in
                    // TODO: I'm just printing it here but you should handle the error in a smart way
                    print(error)
                    print(users);

                    var accepted = [String]()

                    if let userAccepted = user["accepted"] as? [String] {
                        accepted = userAccepted
                    }

                    var rejected = [String]()

                    if let userRejected = user["rejected"] as? [String] {
                        rejected = userRejected
                    }

                    if let users = users as? [PFUser]{
                    for user in users {
                        // TODO: You should move this as a query condition so that you always know you get
                        // 10 users or however many you need
                        if !accepted.contains(user.objectId!) && !rejected.contains(user.objectId!){

                            self.usernames.append(user.username!)
                            self.users.append(user )

                            if let data = user["image"] as? NSData {
                                self.userImages.append(data)
                            }
                        }
                    }
                }

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

                    if ( self.userImages.count > 0 ) {
                        userImage.image = UIImage(data: self.userImages[0])
                        userImage.contentMode = UIViewContentMode.ScaleAspectFit
                        self.view.addSubview(userImage)
                    }

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

                    userImage.userInteractionEnabled = true

                    self.users = (users as? [PFUser])!

                })

            }
        }

    }
}

func wasDragged(gesture: UIPanGestureRecognizer) throws {

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

    xFromCenter += translation.x

    let 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)

    let rotation:CGAffineTransform = CGAffineTransformMakeRotation(xFromCenter / 200)

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

    label.transform = stretch

    if label.center.x < 100 {

        print("Not Chosen")

        PFUser.currentUser()!.addUniqueObject(self.users[self.currentUser], forKey: "rejected")
        try PFUser.currentUser()!.save()

        self.currentUser++

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

        print("Chosen")
        if !isSaving {
            isSaving = true
            PFUser.currentUser()!.addUniqueObject(self.users[self.currentUser], forKey: "accepted")
            PFUser.currentUser()!.saveInBackgroundWithBlock{
                (success: Bool, error: NSError?) -> Void in
                self.isSaving = false
                if success {
                    self.performSegueWithIdentifier("startGame", sender: "user")
                } else {
                    if let realError = error {
                        print(realError)
                    }
                    else {
                        print("Filled without error")
                    }
                }
            }
        }

        //self.currentUser++

        return

    }

    if gesture.state == UIGestureRecognizerState.Ended {


        label.removeFromSuperview()

        if self.currentUser < self.userImages.count {

            let 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)

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

            userImage.userInteractionEnabled = true

            xFromCenter = 0

        } else {

            print("No more users")

        }

    }
}

如有任何帮助,我们将不胜感激。

谢谢!

最佳答案

您必须删除 throws,因为这会更改方法签名并且 objc 无论如何都不会处理它。

关于ios - 无法识别的选择器发送到 Swift 中的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057276/

相关文章:

ios - 子类 uitableview 单元格以快速更改分隔符高度

swift - 如何从自定义类中提供 "sent action"?

ios - Swift 单例或全局变量 - 或者其他什么?

ios - NSCalendar 按年份给出了错误的周数

iphone - 覆盖 UIView :initWithFrame and got nil parameters

ios - NSURLConnection connectionWithRequest :delegate and sendAsynchronousRequest:queue:completionHandler? 之间的主要区别是什么

ios - 如何从 CIAreaHistogram 中提取主色?

ios - CGContext清除警告

ios - 在 segue 之后停止对函数的预定调用

iOS - reloadData 时未调用 cellForRowAtIndexPath