UIImagePicker未返回图像



关联视图包含一个圆形图像视图,用户在其中点击按钮并选择一个图像,然后将该图像设置为查看相应图像的图像。如果我试图强制打开saveChanges中的可选项,它会返回一个错误,说在运行时只找到nil。我已经和这个斗争了好几天了。我真是束手无策。

import UIKit
class EditProfileViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet var editBio: UITextField!
@IBOutlet var editFullName: UITextField!
@IBOutlet var chosenImage: UIImageView!

let imagePicker = UIImagePickerController()

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
makeRounded(imageView: chosenImage)
}

override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
// Do any additional setup after loading the view.
}

@IBAction func imagePicked(_ sender: UIButton) {

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

if let selectedImage = info[.originalImage] as? UIImage {
chosenImage.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
}
@IBAction func saveChanges(_ sender: UIButton) {

if let newChosenImage = chosenImage.image {
ProfileStore.shared.userProfile.profilePicture = newChosenImage
} else {
print("uugghhh")
}
ProfileStore.shared.userProfile.fullName = editFullName.text!
ProfileStore.shared.userProfile.description = editBio.text!
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])

应该在@IBAction func imagePicked(_ sender: UIButton)的范围之外

使用以下代码

@IBAction func imagePicked(_ sender: UIButton) {

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}


}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

if let selectedImage = info[.originalImage] as? UIImage {
chosenImage.image = selectedImage
}
dismiss(animated: true, completion: nil)
}

而不是

@IBAction func imagePicked(_ sender: UIButton) {

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
// it should not be within ` @IBAction func imagePicked(`
// it should be outside  ` @IBAction func imagePicked(`
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

if let selectedImage = info[.originalImage] as? UIImage {
chosenImage.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
}

然后确定

我可以看到picker控制器的委托方法写在按钮内部,它应该在按钮范围之外,请将其与您发布的代码进行比较

class EditProfileViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet var editBio: UITextField!
@IBOutlet var editFullName: UITextField!
@IBOutlet var chosenImage: UIImageView!

let imagePicker = UIImagePickerController()

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
makeRounded(imageView: chosenImage)
}

override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
// Do any additional setup after loading the view.
}

@IBAction func imagePicked(_ sender: UIButton) {

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

if let selectedImage = info[.originalImage] as? UIImage {
chosenImage.image = selectedImage
}
dismiss(animated: true, completion: nil)
}

@IBAction func saveChanges(_ sender: UIButton) {

if let newChosenImage = chosenImage.image {
ProfileStore.shared.userProfile.profilePicture = newChosenImage
} else {
print("uugghhh")
}
ProfileStore.shared.userProfile.fullName = editFullName.text!
ProfileStore.shared.userProfile.description = editBio.text!
}

最新更新