创建具有未知类型的图像格式是错误的...... Swift3

时间:2017-04-15 18:39:45

标签: ios firebase swift3

我在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")
        }
}
}

1 个答案:

答案 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中的一个错误,如果选择器可以正确选择和返回图像,这意味着一切正常,只需忽略它。