ios - 有没有办法让不同文件中的委托(delegate)在 View Controller 中设置变量?

标签 ios swift delegates

上下文:

我有一个 View Controller ,其 Root View 包含一个按钮和一个 UIImage。当按下按钮时,会出现一个 UIImagePickerController。 UIImagePickerController 的委托(delegate)是另一个名为 ImagePickerDelegate 的类。在 ImagePikerDelegate 中的一种方法中,我想使用用户刚刚选择的图像在 View Controller 中设置 imageView。

问题:

如何从 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)
    }
}

最佳答案

我最终为我的问题创建了一个解决方案。不过不确定它是否符合委托(delegate)的最佳做法。

我在 ImagePickerDelegate 中创建了一个实例变量,其中包含托管 imageView 的 ViewController 实例。我还为请求托管图像的 ViewController 的委托(delegate)创建了一个初始化程序。

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)
    }
}

关于ios - 有没有办法让不同文件中的委托(delegate)在 View Controller 中设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648815/

相关文章:

ios - 使用制图的 UIScrollView contentSize 高度

objective-c - 委托(delegate)声明 Swift

ios - 如何在 iOS7 中将 UIManagedDocument 从启用的 iCloud 迁移到仅本地?

ios - 将 NSFetchedResultController 的结果附加到数组 swift

iphone - 将 UILabel 添加到 UITableView - iphone

ios - 更改 NSAttributedString 的字体大小和字体颜色

c# - 为什么.NET Framework 指定标准委托(delegate)(Action)?

iPhone:应用程序委托(delegate)中的 NSTimer 无效导致应用程序崩溃

ios - UIPickerView 不会显示

ios - Uibutton 的 titleLabel.textColor