允许用户从相机、照片库或相册中选择图像,然后遇到我无法解决的错误



我一直在关注David Thorn的视频,以允许用户使用相机拍摄图像或从照片库或相册导入图像。

https://www.youtube.com/watch?v=wDzk5KDe6Uw

我一个角色接一个角色地遵循指南,并在下面的图片中遇到了错误。我已经将我的代码与教程的Github中的代码进行了比较,但找不到解决方案。

以下是错误的屏幕截图(没有足够的信誉嵌入帖子(

错误为

1!类型为"ViewController"的值没有成员"selectedImage">

2!nil不能分配给类型"(UIImagePickerController,[UIMImagePickerCntroller.InfoKey:Any](->((">

2!'nil"不能分配给类型"(UIImagePickerController,[UIMImagePickerCntroller.InfoKey:Any](->((">

.swift文件的类型为UIViewController。

这是我输入的代码;

public var imagePickerController: UIImagePickerController?
public var defaultImageUrl: URL?
internal var selectedImage: UIImage? {
get {
return self.selectedImageView.image
}
set {
switch newValue {
case nil:
self.selectedImageView.image = nil
self.selectImageButton.isEnabled = true
self.selectImageButton.alpha = 1
self.removeImageButton.isEnabled = false
self.removeImageButton.alpha = 0.5
default:
self.selectedImageView.image = newValue
self.selectImageButton.isEnabled = false
self.selectImageButton.alpha = 0.5
self.removeImageButton.isEnabled = true
self.removeImageButton.alpha = 1
}
}
}
//This outlet, 'selectedImageContainer' was guessed from observing the tutorial stacked their UIImageView in a UIView.
@IBOutlet weak var selectedImageContainer: UIView!
@IBOutlet weak var selectedImageView: UIImageView!

@IBOutlet weak var selectImageButton: UIButton! {
didSet {
guard let button = self.selectImageButton else { return }
button.isEnabled = true
button.alpha = 1
}
}
@IBOutlet weak var removeImageButton: UIButton! {
didSet {
guard let button = self.removeImageButton else { return }
button.isEnabled = false
button.alpha = 0.5
}
override func viewDidLoad() {
super.viewDidLoad()
self.selectedImageView.contentMode = .scaleAspectFit
self.selectImageButton.isEnabled = self.selectedImage == nil
self.selectImageButton.alpha = 1
}

@IBAction func selectImageButtonAction(_ sender: Any) {

if self.imagePickerController != nil {
self.imagePickerController?.delegate = nil
self.imagePickerController = nil
}
self.imagePickerController = UIImagePickerController.init()
let alert = UIAlertController.init(title: "Select Source Type", message: nil, preferredStyle: .actionSheet)
if UIImagePickerController.isSourceTypeAvailable(.camera) {
alert.addAction(UIAlertAction.init(title: "Camera", style: .default, handler: { (_) in
self.presentImagePicker(controller: self.imagePickerController!, source: .camera)
}))
}
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
alert.addAction(UIAlertAction.init(title: "Photo Library", style: .default, handler: { (_) in
self.presentImagePicker(controller: self.imagePickerController!, source: .photoLibrary)
}))
}
if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
alert.addAction(UIAlertAction.init(title: "Saved Albums", style: .default, handler: { (_) in
self.presentImagePicker(controller: self.imagePickerController!, source: .savedPhotosAlbum)
}))
}
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel))
self.present(alert, animated: true)
}
internal func presentImagePicker(controller: UIImagePickerController , source: UIImagePickerController.SourceType) {
controller.delegate = self
controller.sourceType = source
self.present (controller, animated: true)
}
@IBAction func removeImageButtonAction(_ sender: UIButton) {
self.selectedImage = nil
}

}
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
return self.imagePickerControllerDidCancel(picker)
}
self.selectedImage = image
picker.dismiss(animated: true) {
picker.delegate = nil
self.imagePickerController = nil
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true) {
picker.delegate = nil
self.imagePickerController = nil
}
}
}

我已经回答了我自己的问题!

扩展类ViewController的名称不正确。我的.swift文件被命名为其他名称。

我还从代码顶部的原始类中移动了UIImageViewControllerDelegate和UINavigatonControllerDeletage,所以它只出现在扩展中!

相关内容

最新更新