我在youtube上学习了一些快速的3个以下课程。我编写的代码用于创建用户帐户并在Firebase数据库中存储详细信息。在测试时,我可以直到提交注册表单。然后我收到以下错误:
[Generic] Creating an image format with an unknown type is an error.
Fatal Error: unexpectedly found nil whilst unwrapping an Optionional value.
我在下面的代码块中突出显示的行中也有以下内容:
exc_bad_instruction(code=exc_i386_invop subcode=0x0)
以下是我的代码。我已经突出显示了抛出异常的位置。非常感谢任何帮助。
import UIKit
import Firebase
class Signup_ViewController: UIViewController,
UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// Input data fields for signup form
@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var nameField: UITextField!
// Password data field for signup form
@IBOutlet weak var passwordField: UITextField!
@IBOutlet weak var confirmPasswordField: UITextField!
// Next button for signup form (Hidden by default)
@IBOutlet weak var nextBtn: UIButton!
let picker = UIImagePickerController()
var userStorage: FIRStorageReference!
var ref: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
picker.delegate = self
let storage = FIRStorage.storage().reference(forURL: "XXXXXXXXXXXXXXXXXXXX") // Defines URL for Firebase storage container
ref = FIRDatabase.database().reference()
userStorage = storage.child("users") // Folder on Firebase storage
}
// Image for signup form - user profile image
@IBOutlet weak var imgView: UIImageView!
// Action for when user presses the "Select profile picture" button
@IBAction func selectProfileImagePress(_ sender: Any) {
picker.allowsEditing = true // Enables user to edit photo
picker.sourceType = .photoLibrary // Enables user to pick photo from photo library
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
self.imgView.image = image // Checks image selected exists
nextBtn.isHidden = false // Unhides "Next" button once image has been picked
}
self.dismiss(animated: true, completion: nil)
}
// Action for when the "Next" button is pressed
@IBAction func nextPressed(_ sender: Any) {
guard usernameField.text != "", nameField.text != "", emailField.text != "", passwordField.text != "", confirmPasswordField.text != "" else { return }
if passwordField.text == confirmPasswordField.text { // Checks password and confirm password match <---- Error highlights this line when the app crashes out.
FIRAuth.auth()?.createUser(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
}
if let user = user {
let changeRequest = FIRAuth.auth()!.currentUser!.profileChangeRequest()
changeRequest.displayName = self.nameField.text!
changeRequest.commitChanges(completion: nil)
let imageRef = self.userStorage.child("\(user.uid).jpg") // Creates JPG file for user uploading (user.uid is variable for specific user)
let data = UIImageJPEGRepresentation(self.imgView.image!, 0.5) // Prepares user profile picture to be sent to Firebase. Applies 0.5 compression to image.
let uploadTask = imageRef.put(data!, metadata: nil, completion: { (metadata, err) in
if err != nil {
print(err!.localizedDescription)
}
imageRef.downloadURL(completion: { (url, er) in
if er != nil {
print(er!.localizedDescription)
}
if let url = url {
let userInfo: [String : Any] = ["uid" : user.uid,
"username" : self.usernameField.text!,
"name" : self.nameField.text!,
"urltoImage" : url.absoluteString]
self.ref.child("users").child(user.uid).setValue(userInfo)
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "userVC")
self.present(vc, animated: true, completion: nil)
}
})
})
uploadTask.resume()
}
})
} else {
print ("Password does not match")
}
}
}
答案 0 :(得分:5)
而不是你的代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
self.imgView.image = image // Checks image selected exists
nextBtn.isHidden = false // Unhides "Next" button once image has been picked
}
self.dismiss(animated: true, completion: nil)
}
使用这个......
/// what app will do when user choose & complete the selection image :
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
/// chcek if you can return edited image that user choose it if user already edit it(crop it), return it as image
if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
/// if user update it and already got it , just return it to 'self.imgView.image'
self.imgView.image = editedImage
/// else if you could't find the edited image that means user select original image same is it without editing .
} else if let orginalImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
/// if user update it and already got it , just return it to 'self.imgView.image'.
self.imgView.image = orginalImage
}
else { print ("error") }
/// if the request successfully done just dismiss
picker.dismiss(animated: true, completion: nil)
}
对于这个错误:
创建具有未知类型的图像格式是一个错误...... Swift3
这是xcode中的一个错误,如果选择器可以正确选择和返回图像,这意味着一切正常,只需忽略它。