Ios 将图像从Swift文件(不是ViewController)传递到ViewController

Ios 将图像从Swift文件(不是ViewController)传递到ViewController,ios,swift,Ios,Swift,我在扩展中使用cropViewController来裁剪图像。结果将出现在swift文件中(该文件不是视图控制器)。但是现在需要在另一个视图控制器中设置图像 正在使用的CropViewController: 我的视图控制器文件包含以下元素 import UIKit import XLPagerTabStrip class GetPetViewController: UIViewController, IndicatorInfoProvider { // Initialize Defau

我在扩展中使用cropViewController来裁剪图像。结果将出现在swift文件中(该文件不是视图控制器)。但是现在需要在另一个视图控制器中设置图像

正在使用的CropViewController:

我的视图控制器文件包含以下元素

import UIKit
import XLPagerTabStrip

class GetPetViewController: UIViewController, IndicatorInfoProvider {
    // Initialize Default Value
    let userDefault = UserDefaults.standard

    @IBOutlet var bPetImage: UIButton!

    @IBAction func bPetImage_TouchUpInside(_ sender: Any) {
        // Start Action Sheet
        StartImageActionSheet()
    }

    @IBAction func bSavePet_TouchUpInside(_ sender: Any) {
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set The Default Value
        userDefault.set("GetPet", forKey: "senderActivity")
        userDefault.synchronize()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // Tab Functionality
    func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
        return IndicatorInfo(image: UIImage(named: "ic_get_pet"), highlightedImage: UIImage(named: "ic_get_pet"), userInfo: Any?.self)
    }
}
我的第二个文件(不是视图控制器)

基本上,这在swift文件中不起作用(我已经对其进行了注释),但是如果我在视图控制器本身中使用这个不带扩展名的裁剪器函数,它将起作用

bPetImage.setImage(image, for: UIControl.State.normal)
就在
myImageUploadRequest(image:image)


但是获取错误:
线程1:致命错误:在隐式展开可选值时意外发现nil

因此,如果我正确获取该值,您将拥有另一个名为
MyViewController
的视图控制器,其中包含按钮
bPetImage
。这个按钮现在应该可以得到图像了。但您所做的是将协议设置为超类
UIViewController:CropViewControllerDelegate
,该超类无权访问该按钮

在您的案例中,快速简单的解决方案可能是

(self as? MyViewController)?.bPetImage.setImage(image, for: UIControl.State.normal)
至少我希望在您的例子中,
self
MyViewController
实例。一般来说,这不是一个很好的程序。我将创建一个特定的协议,而不是一个通用的协议。我宁愿:

extension MyViewController: CropViewControllerDelegate {
在这种情况下,您可以直接调用它(您注释掉的代码)

但是,如果您真的想按您的方式使用它,让
UIViewController
响应
CropViewControllerDelegate
,那么我只建议您添加一个新协议。考虑这样的事情:

protocol SetCroppedImageDelegate {
    func setCroppedImage(_ image: UIImage)
}
现在您键入委托而不是具体类:

public func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
    (self as? SetCroppedImageDelegate)?.setCroppedImage(image)

    // Call Function To Upload Image To Server
    myImageUploadRequest(image: image)

    cropViewController.dismiss(animated: true, completion: nil)
}
现在,您可以扩展您的
MyViewController

extension MyViewController : SetCroppedImageDelegate {
    func setCroppedImage(_ image: UIImage) {
        bPetImage.setImage(image, for: UIControl.State.normal)
    }
}

问题是什么?如何在viewcontroller的BPTIMAGE中设置图像在cropviewcontroller的swift文件中获取图像后(作为图像)我正在阅读您的答案并试图理解它请耐心等待我有点slow@DragonFire不用担心。花你需要的所有时间:)答案1和3中没有加载图像,答案2我正试图避免,因为我想在多个ViewController中使用此图像裁剪功能。。。但“self-as”似乎有问题,因为没有调用func setcropedimage(我尝试了打印(“函数调用”)有。@DragonFire您这边似乎还需要其他信息。视图控制器是如何连接的。那么您的委托人是谁?应该是
MyViewController
。请看我已经用这两个文件中的所有代码更新了代码
public func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
    (self as? SetCroppedImageDelegate)?.setCroppedImage(image)

    // Call Function To Upload Image To Server
    myImageUploadRequest(image: image)

    cropViewController.dismiss(animated: true, completion: nil)
}
extension MyViewController : SetCroppedImageDelegate {
    func setCroppedImage(_ image: UIImage) {
        bPetImage.setImage(image, for: UIControl.State.normal)
    }
}