ios - Swift - 通过委托(delegate)将 UIImage 传递给 UIImageView

标签 ios swift uiimageview uiimage protocols

我没有主意,也不知道如何解决这个问题。任何帮助将不胜感激。

我遇到以下情况:

  • MainViewController 指向嵌入在 NavController 中的 CollectionView
  • CollectionView 指向 DetailViewController
  • DetailViewController 显示在 CollectionView 中选择的完整图片,并有一个按钮将该图像传递到 MainViewController。协议(protocol)和委托(delegate)用于此
  • 此图像现在应该显示在 MainViewController 的 UIImageView 中

代表团工作正常。我的 MainViewController 中有一个 UIImage。但是:UIImageView 为零。因此,当我将所选图像设置为 imageView.image 时,它​​会崩溃。 MainViewController 已初始化,我还看到了我的默认图片。请参阅下面的代码和控制台输出。

主视图 Controller

    class MainViewController: UIViewController, UserChosePhoto {

    @IBOutlet weak var googleImageView: UIImageView!
    var usedImage: UIImage? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        googleImageView.image = usedImage
        println("viewDidLoad: \(googleImageView)")
    }

    func userHasChosen(image: UIImage) {
        usedImage = image
        println("imageView: \(googleImageView)")
        println("delegation: \(image)")
    }
}

详细 View Controller

 protocol UserChosePhoto {
    func userHasChosen(image: UIImage)
}

class GoogleDetailViewController: UIViewController {

    @IBOutlet weak var bigImageView: UIImageView!
    var image: UIImage? = nil
    var delegate: UserChosePhoto? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        bigImageView.image = image
        let barButtonItem = UIBarButtonItem(title: "Use", style: UIBarButtonItemStyle.Plain, target: self, action: "tapped")
        self.navigationItem.rightBarButtonItem = barButtonItem
        self.delegate = MainViewController()
    }

    func tapped() {
        if (delegate != nil) {
            self.delegate!.userHasChosen(bigImageView.image!)
        }
        self.dismissViewControllerAnimated(true, completion: nil)
    }

}

控制台输出:第一个 viewDidLoad 日志来自应用程序启动。找到 10 张图片 - 来自 API 调用的日志。 imageView - 这是有问题的 imageView。委托(delegate):这里我有一个 UIImage

viewDidLoad: <UIImageView: 0x7f94825cabf0; frame = (180 159; 240 282); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7f94825caeb0>> - (null)
found 10 pictures
imageView: nil
delegation: <UIImage: 0x7f94848344a0>, {213, 290}

任何提示都会很酷 - 我现在真的迷路了。

谢谢!

最佳答案

这可能是问题所在:

self.delegate = MainViewController()

在这里您设置 DetailViewController的委托(delegate)给 MainViewController实例(因此有括号)。您需要将委托(delegate)设置为其父级(其类型也是 MainViewController )

当您调用self.dismissViewControllerAnimated(true, completion: nil)时您现在将返回到原来的 MainViewController但函数 userHasChosen从未在此 View Controller 上调用过,因此它崩溃了。

因此,本质上您需要做的是确保 delegate您的DetailViewController设置为其父级,您可以通过执行 myDetailViewController.parent 来获得它(有时这对我不起作用,但我现在不在 XCode 中进行测试)或者您可以将父级的引用传递给您的 subview Controller 并将其设置为其 delegate .

编辑:我对代码和 View Controller 的设置方式做了一些假设,这些假设可能不完全准确。如果您的控制流确实进入 MainVC -> CollectionView -> DetailVC,那么您可能无法仅获取其“父级”。相反,您必须执行我建议的第二部分,即将 MainVC 的引用传递给 DetailVC,然后您可以在该 ViewController 中使用它,而不是创建新的 MainViewController .

因为可能不清楚:当我提到DetailViewController时的父级,我的意思是 MainViewController它来自其中,而不是 CollectionView(即使那里的按钮将您带到 DetailVC)

关于ios - Swift - 通过委托(delegate)将 UIImage 传递给 UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873889/

相关文章:

ios - 从 Swift 中的 Eureka Forms 获取值

iOS swift : Cannot Manipulate String: Value of type 'String' has no member 'firstIndex'

ios - 如何设置 UISwitch 状态,并调出 View Controller ,按取消,然后关闭开关

ios - 无法从 UIView 扩展调用方法

iphone - 访问 iPhone 用户歌曲和视频?

ios - 在字典数组中查找字典的索引

ios - 初始化 GKMatchMakerViewController 时出错

ios - 为什么围绕 x 轴平移 CALayer 会影响围绕 Y 轴的旋转

swift - 将我的 UIImageView 转换为 SWIFT 中的 PFFile

ios - AFNetworking 下载和设置图像