Ios 如何将选定图像从UIImagePicker传递到UIViewController

Ios 如何将选定图像从UIImagePicker传递到UIViewController,ios,swift,xcode,uiimagepickercontroller,Ios,Swift,Xcode,Uiimagepickercontroller,我已经在我的应用程序中实现了一个UIImagePicker,但我正在努力将UIImage传递给UIViewController,该选择器是从下面代码中的注释启动的 下面的代码是存储在Extensions/ImageUploader.swift中的扩展名 在createActivityVC中,我有这个iAction来访问照片库并启动picker-self.imagePicker @IBAction func addPictureBtnWasPressed(_ sender: Any) {

我已经在我的应用程序中实现了一个UIImagePicker,但我正在努力将UIImage传递给UIViewController,该选择器是从下面代码中的注释启动的

下面的代码是存储在Extensions/ImageUploader.swift中的扩展名

在createActivityVC中,我有这个iAction来访问照片库并启动picker-self.imagePicker

@IBAction func addPictureBtnWasPressed(_ sender: Any) {

    PHPhotoLibrary.requestAuthorization({(status:PHAuthorizationStatus) in
        switch(status) {

       case .notDetermined:

        // Access has not been determined.
        PHPhotoLibrary.requestAuthorization({ (newStatus) in

            if (newStatus == PHAuthorizationStatus.authorized) {
                // Access has been granted.

                self.imagePicker() 
            }

            else {

            }
        })
        break

    case .restricted:
        break

    case .denied:
        // Access has been denied.
        print("Acccess to photo denied")
        break

    case .authorized:
        // Access has been granted.
        print("Access to photo authorized")

         self.imagePicker()

         break


      }
   })
}

我想将selectedImageFromPicker传递给viewController createActivityVC。如何做到这一点?我不希望具体命名viewController,而是将其设置为动态的,以便尽可能跨多个viewController使用imagePicker。

在您的表单中,是否实现了UIImageView?如果是这样的话,在你的

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
你可以说:

myFormImageView.image = selectedImageFromPicker
然后,当您提交表单时,您可以上传表单信息+图像数据

更新:

我的方法是将UIIMagePickerController子类化

import UIKit

protocol ImagePickerDelegate {
    func imagePicked(image: UIImage)
}

class myPickerViewController: UIImagePickerController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    var imagePickerDelegate:ImagePickerDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        allowsEditing = true
        delegate = self
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            imagePickerDelegate.imagePicked(image: selectedImage)
        dismiss(animated: true, completion: nil)
    }

}

class ViewController : UIViewController, ImagePickerDelegate {

    func imagePicked(image: UIImage) {
        imagePicked = image
    }


    var imagePicked:UIImage! {
        didSet {
            imageView.image = imagePicked
        }
    }

    let button: UIButton = {
       let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle("Select an image", for: .normal)
        button.backgroundColor = .red
        button.addTarget(self, action: #selector(handleImagePicker), for: .touchUpInside)
        return button
    }()

    let imageView: UIImageView = {
        let iv = UIImageView()
        iv.translatesAutoresizingMaskIntoConstraints = false
        iv.contentMode = .scaleAspectFill
        iv.layer.masksToBounds = true
        iv.layer.borderWidth = 2
        iv.layer.borderColor = UIColor.black.cgColor
        return iv
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Get image via Delegate"
        view.backgroundColor = .white

        view.addSubview(button)
        view.addSubview(imageView)

        button.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100).isActive = true
        button.heightAnchor.constraint(equalToConstant: 30).isActive = true
        button.widthAnchor.constraint(equalToConstant: 150).isActive = true
        button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true

        imageView.topAnchor.constraint(equalTo: self.button.topAnchor, constant: 50).isActive = true
        imageView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
        imageView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -20).isActive = true
        imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50).isActive = true

    }

    @objc func handleImagePicker() {
        let myPickerVC = myPickerViewController()
        myPickerVC.imagePickerDelegate = self

        self.present(myPickerVC, animated: true, completion: nil )
    }

}
你创建一个新项目并粘贴整个代码,我想它会像我一样工作。 希望对Swift 4.2有所帮助

使用Swift 4.2从imagePicker获取的图像更改如下代码所示

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        imagePickerDelegate.imagePicked(image: selectedImage)
        dismiss(animated: true, completion: nil) 
}

出于不同的原因,我想在应用程序的多个位置使用imagePicker。因此,最好将selectedImageFromPicker传递给调用它的ViewController。有什么方法可以做到这一点吗?你能更准确一点吗?我不太清楚。如果您现在可以更新原始问题,请更新您的问题。希望这有助于使用选择器的所有视图控制器具有相同的设计?相同的设计是什么意思?它们看起来不同,代码也不同。。所以我想说它们是不同的,但它们会以同样的方式使用选择器……这段代码在哪里?如果是在VC中,则表示选取器,并且已将其正确设置为选取器代理,则只需使selectedImageFromPicker在ImagePickerControllerdFinishPickingMediaWithInfo之外可用。从表面上看,这一切都是你做的。所以,要么是一个简单的变量范围问题,要么你没有明确说明问题所在。问得好。我更新了问题以反映这一点。ViewController中调用的imagePicker函数实际上存储为一个扩展imageUploader.swift,因此不是ViewController文件的一部分啊,请阅读您对建议答案的评论。你有几个选择。在我的脑海中,根据需要将选择器实例(它只是一个特定的视图控制器)提供给任何/所有控制器。第二个选择是不用担心。。。只要在需要的地方实例化选择器。但是是的,这是糟糕的设计。第三,重构东西,使你的应用程序不需要一个以上的控制器来显示选择器-当你需要通过时,只需通过显示下一个控制器或继续向它传递图像。如果我可以让图像选择器返回selectedImageFromPicker,那么我认为应该解决这个问题。。。。这可能吗?您经常创建自己的代理吗?这听起来似乎是一个很好的候选人。您不需要命名感兴趣的视图控制器-相反,您可以让任何感兴趣的VC成为VC的代表,来演示选择器。在这一点上,采摘器VC只是简单地告诉正在进行呈现的VC一个新的图像被选中。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        imagePickerDelegate.imagePicked(image: selectedImage)
        dismiss(animated: true, completion: nil) 
}