Ios 不同文件中的委托是否可以在视图控制器中设置变量?

Ios 不同文件中的委托是否可以在视图控制器中设置变量?,ios,swift,delegates,Ios,Swift,Delegates,背景: 我有一个视图控制器,它的根视图包含一个按钮和一个UIImage。按下按钮时,将显示UIImagePickerController。UIImagePickerController的委托是另一个名为ImagePickerDelegate的类。在ImagePikerDelegate中的一个方法中,我想使用用户刚刚拾取的图像设置imageView In view控制器 问题: 如何从ImagePickerDelegate访问ViewController中的imageView实例变量 代码: im

背景:

我有一个视图控制器,它的根视图包含一个按钮和一个UIImage。按下按钮时,将显示UIImagePickerController。UIImagePickerController的委托是另一个名为ImagePickerDelegate的类。在ImagePikerDelegate中的一个方法中,我想使用用户刚刚拾取的图像设置imageView In view控制器

问题:

如何从ImagePickerDelegate访问ViewController中的imageView实例变量

代码:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var pickImageItemBarButton: UIBarButtonItem!

    lazy var imagePickerDelegate: ImagePickerDelegate = ImagePickerDelegate()

    override func viewDidLoad() {
        super.viewDidLoad()

        // enable pick image button if photo library is available
        pickImageItemBarButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
    }

    @IBAction func pickAnImage(_ sender: UIBarButtonItem) {
        let imagePicker = UIImagePickerController()
        // set imagePicker properties
        imagePicker.delegate = imagePickerDelegate
        imagePicker.allowsEditing = false

        // set the source type as photo library
        imagePicker.sourceType = .photoLibrary

        // check if public.image is an available mediaType
        if let _ = UIImagePickerController.availableMediaTypes(for: imagePicker.sourceType)?.contains("public.image") {
            // set mediaType
            imagePicker.mediaTypes = ["public.image"]
            // present imagePicker modally
            present(imagePicker, animated: true, completion: nil)
        }
    }
}

class ImagePickerDelegate: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    // MARK: Delegate Functions
    // cancel imagePicker
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

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

        if let image = info[.originalImage] as? UIImage {
            // ----This is where I need to access imageView from ViewController to set an image ----
        }

        // dismiss the picker modal view
        picker.dismiss(animated: true, completion: nil)
    }
}

我最终找到了解决问题的办法。但不确定是否符合学员的最佳实践

我在ImagePickerDelegate中创建了一个实例变量,其中包含承载imageView的ViewController实例。我还为委托创建了一个初始值设定项,该初始值设定项请求承载图像的ViewController

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var pickImageItemBarButton: UIBarButtonItem!

    lazy var imagePickerDelegate: ImagePickerDelegate = ImagePickerDelegate(imageHost: self)

    override func viewDidLoad() {
        super.viewDidLoad()

        // enable pick image button if photo library is available
        pickImageItemBarButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
    }

    @IBAction func pickAnImage(_ sender: UIBarButtonItem) {
        let imagePicker = UIImagePickerController()
        // set imagePicker properties
        imagePicker.delegate = imagePickerDelegate
        imagePicker.allowsEditing = false

        // set the source type as photo library
        imagePicker.sourceType = .photoLibrary

        // check if public.image is an available mediaType
        if let _ = UIImagePickerController.availableMediaTypes(for: imagePicker.sourceType)?.contains("public.image") {
            // set mediaType
            imagePicker.mediaTypes = ["public.image"]
            // present imagePicker modally
            present(imagePicker, animated: true, completion: nil)
        }
    }
}

class ImagePickerDelegate: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    // MARK: Properties
    let viewControllerHostingImage: ViewController

    init(imageHost vc: ViewController) {
        self.viewControllerHostingImage = vc
    }

    // MARK: Delegate Functions
    // cancel imagePicker
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

    // image picked
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage {
            // set image in hosting view controller's imageView
            viewControllerHostingImage.imageView = image
        }

        // dismiss the picker modal view
        picker.dismiss(animated: true, completion: nil)
    }
}

我最终找到了解决问题的办法。但不确定是否符合学员的最佳实践

我在ImagePickerDelegate中创建了一个实例变量,其中包含承载imageView的ViewController实例。我还为委托创建了一个初始值设定项,该初始值设定项请求承载图像的ViewController

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var pickImageItemBarButton: UIBarButtonItem!

    lazy var imagePickerDelegate: ImagePickerDelegate = ImagePickerDelegate(imageHost: self)

    override func viewDidLoad() {
        super.viewDidLoad()

        // enable pick image button if photo library is available
        pickImageItemBarButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
    }

    @IBAction func pickAnImage(_ sender: UIBarButtonItem) {
        let imagePicker = UIImagePickerController()
        // set imagePicker properties
        imagePicker.delegate = imagePickerDelegate
        imagePicker.allowsEditing = false

        // set the source type as photo library
        imagePicker.sourceType = .photoLibrary

        // check if public.image is an available mediaType
        if let _ = UIImagePickerController.availableMediaTypes(for: imagePicker.sourceType)?.contains("public.image") {
            // set mediaType
            imagePicker.mediaTypes = ["public.image"]
            // present imagePicker modally
            present(imagePicker, animated: true, completion: nil)
        }
    }
}

class ImagePickerDelegate: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    // MARK: Properties
    let viewControllerHostingImage: ViewController

    init(imageHost vc: ViewController) {
        self.viewControllerHostingImage = vc
    }

    // MARK: Delegate Functions
    // cancel imagePicker
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

    // image picked
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage {
            // set image in hosting view controller's imageView
            viewControllerHostingImage.imageView = image
        }

        // dismiss the picker modal view
        picker.dismiss(animated: true, completion: nil)
    }
}

你能提供一些示例代码吗?你能提供一些示例代码吗?