2015-12-03 117 views
0

我的应用程序使用手势向左或向右滑动图片(我正在学习教程)。代码用于正常工作,但我认为在将Xcode更新为7(从版本6开始)之后,代码已经崩溃。当我去刷卡的照片应用程序崩溃,并显示以下信息:无法识别的选择器在Swift中发送到实例?

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[....... wasDragged:]: unrecognized selector sent to instance

这似乎是在斯威夫特一个常见的错误有很多不同的原因,为什么这可能发生。我核实,我其实主叫外线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") 

     } 

    } 
} 

任何帮助将不胜感激。

谢谢!

+1

您必须删除“throws”,因为这会更改方法签名,而objc无法处理它。 – fluidsonic

+0

是这样!更新后,“抛出”部分必须隐藏在那里。谢谢!!添加一个答案,我会接受它 – winston

回答

2

您必须删除throws,因为这会更改方法签名,而objc无法处理它。

相关问题