Reputation: 455
I know this question has been asked before but none of the answers have fixed my issue. I'm getting the error:
Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}
I have another project where I'm using this exact method in another project that works perfectly fine. I have tried to place @objc in front of the functions but get this error:
Objective-C method
imagePickerController:didFinishPickingMediaWithInfo:
provided by methodimagePickerController(_:didFinishPickingMediaWithInfo:)
conflicts with optional requirement methodimagePickerController(_:didFinishPickingMediaWithInfo:)
in protocolUIImagePickerControllerDelegate
.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let uid = Auth.auth().currentUser?.uid else { return }
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
let editImage = editedImage.withRenderingMode(.alwaysOriginal)
guard let uploadData = editImage.jpegData(compressionQuality: 0.3) else { return }
let filename = NSUUID().uuidString
let stoarageRef = Storage.storage().reference().child("profile_images").child(filename)
stoarageRef.putData(uploadData, metadata: nil) { (metadata, error) in
if let error = error {
print("Failed update profile image:", error)
}
stoarageRef.downloadURL(completion: { (downloadUrl, error) in
guard let profileImageUrl = downloadUrl?.absoluteString else { return }
print("Successfully updated image in storage:", profileImageUrl)
let dictionaryValues = ["profileImageUrl": profileImageUrl]
Database.database().reference().child("users").child(uid).updateChildValues(dictionaryValues, withCompletionBlock: { (error, ref) in
if let error = error {
print("There was an error:", error)
return
}
print("Successfully saved user info to db")
})
})
}
} else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
let origImage = originalImage.withRenderingMode(.alwaysOriginal)
guard let uploadData = origImage.jpegData(compressionQuality: 0.3) else { return }
let filename = NSUUID().uuidString
let stoarageRef = Storage.storage().reference().child("profile_images").child(filename)
stoarageRef.putData(uploadData, metadata: nil) { (metadata, error) in
if let error = error {
print("Failed update profile image:", error)
}
stoarageRef.downloadURL(completion: { (downloadUrl, error) in
guard let profileImageUrl = downloadUrl?.absoluteString else { return }
print("Successfully updated image in storage:", profileImageUrl)
let dictionaryValues = ["profileImageUrl": profileImageUrl]
Database.database().reference().child("users").child(uid).updateChildValues(dictionaryValues, withCompletionBlock: { (error, ref) in
if let error = error {
print("There was an error:", error)
return
}
print("Successfully saved user info to db")
})
})
}
}
dismiss(animated: true, completion: nil)
}
Thank you for any help fixing this issue.
Upvotes: 6
Views: 4780
Reputation: 4919
Swift 5, Xcode 11
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
backgroundImage = (info[UIImagePickerController.InfoKey.originalImage] as? UIImage)!
ivBackground.image = backgroundImage
picker.dismiss(animated: true, completion: nil)
}
Upvotes: 10
Reputation: 11210
This is not just Swift 5 problem. Type of info
parameter for this delegate method was changed from [String : Any]
to [UIImagePickerController.InfoKey : Any]
a long time ago.
This is why compiler complains that your, in this case your own, method conflicts with method declared by implemented protocol.
So, you need to implement delegate's method with correct type of parameter
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
<#code#>
}
Upvotes: 4
Reputation: 401
The new function name is what causes the error, it is confused with two different functions that do the same thing.
It used to be [String : Any]
(which is what you have) but now they have changed it to [UIImagePickerController.InfoKey : Any]
. This change just means that the info is going to be type of UIImagePickerController.InfoKey
.
Try use this as your function name, it got changed a while ago (not in Swift 5):
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
Hope this helps!
Upvotes: 2