关联视图包含一个圆形图像视图,用户在其中点击按钮并选择一个图像,然后将该图像设置为查看相应图像的图像。如果我试图强制打开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!
}