【问题标题】:Swift - Passing an UIImage to an UIImageView via delegationSwift - 通过委托将 UIImage 传递给 UIImageView
【发布时间】:2015-06-16 17:07:03
【问题描述】:

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

我遇到以下情况:

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

委托有效。我的 MainViewController 中有一个 UIImage。但是: UIImageView 为零。因此,当我将所选图像设置为 imageView.image 时,它​​会崩溃。 MainViewController 已初始化,我还看到了我的默认图片。代码和控制台输出见下文。

主视图控制器

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

DetailViewController

 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-log 来自应用启动。找到 10 张图片 - 来自 API 调用的日志。 imageView - 这是有问题的 imageView。委托:这里我有一个 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}

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

谢谢!

【问题讨论】:

    标签: ios swift uiimageview uiimage protocols


    【解决方案1】:

    这可能是问题所在:

    self.delegate = MainViewController()

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

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

    因此,基本上您需要做的是确保将您的DetailViewControllerdelegate 设置为其父级,您可以通过执行myDetailViewController.parent 来获得它(有时这不适用于我,但我目前不在 XCode 中进行测试)或者您可以将父级的引用传递给您的子视图控制器并将其设置为 delegate

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

    因为它可能不清楚:当我提到 DetailViewController 的父级时,我指的是它来自的 MainViewController,而不是 CollectionView(即使那里的按钮将你带到详情VC)

    【讨论】:

    • 就是这样!谢谢!我刚刚将 MainViewController 的引用传递给 DetailViewController,现在它正在工作!
    • 太好了,很高兴我能帮上忙!
    • 确保将委托指定为weak,否则您将创建一个保留周期。
    【解决方案2】:

    您从未真正为图像视图设置image 属性。您唯一一次这样做是在viewDidLoad 中,此时它可能不存在并且您不会再这样做。设置它的操作是一次性的并且不会绑定数据,因此您必须在每次更新属性时自行更新它。应该这样做:

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

    另一种方法(可以说更简洁)是为您的图像属性实现didSet 挂钩。

    var usedImage: UIImage? = nil
    {
        didSet
        {
            googleImageView.image = usedImage
        }
    }
    

    【讨论】:

    • 您的MainViewController 中的某处发生了其他事情。从那里显示更多与图像视图交互的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多