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")
}
}
}
任何幫助將不勝感激。
謝謝!
您必須刪除「throws」,因爲這會更改方法簽名,而objc無法處理它。 – fluidsonic
是這樣!更新後,「拋出」部分必須隱藏在那裏。謝謝!!添加一個答案,我會接受它 – winston