swift - iOS - 如何通过子容器设置父 View Controller 的imageview?

标签 swift uicontainerview childviewcontroller parentviewcontroller

我当前正在使用容器 View ,我想使用委托(delegate)通过 subview Controller 更改父 View Controller imageView 的值,但它总是返回 nil

import UIKit

protocol updateImage {
    func userIsDone(image:UIImage)
}

class ViewController: UIViewController, updateImage{

    @IBOutlet weak var imageView:UIImageView!
    var image = UIImage(named: "hello.png")

    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.image=self.image
    }

    func userIsDone(image: UIImage) {
        self.image=image
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "containerChild"{

            let nextView = segue.destinationViewController as! ControllerChild
            nextView.image=self.image
            nextView.delegate=self
        }
    }
}

class ControllerChild:UIViewController{

    var image=UIImage(named: "newhello.png")
    var delegate: updateImage? = nil

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

    @IBAction func changeImage(sender:UIButton){

        if(delegate != nil){
            self.delegate!.userIsDone(self.image!)
            print("I am Called!")
        }
    }
}

最佳答案

删除此行:

nextView.image = image

并将 userIsDone 函数更改为:

func userIsDone(image: UIImage) {
    imageView.image = image
}

hello

作为旁注:

  • 在 Swift 中,您不需要在 block /闭包之外使用 self。例如,您不需要 self.imageView.image = self.image - 只需 imageView.image = image 即可。
  • 协议(protocol)应大写,例如 UpdateImage(而不是 updateImage)。
  • 您不需要额外的 .png 来引用图像,只需标题即可,例如:“hello”

Apple 在其 awesome Swift book 中描述了 Swift 代码约定.

这是重构的代码(Swift 3):

import UIKit

protocol UpdateImageProtocol {
    func userIsDone(image: UIImage)
}

class ViewController: UIViewController, UpdateImageProtocol {

    @IBOutlet weak var imageView: UIImageView!
    var image = UIImage(named: "hello")

    override func viewDidLoad() {
        super.viewDidLoad()
        userIsDone(image: image!)
    }

    func userIsDone(image: UIImage) {
        imageView.image = image
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "containerChild" {
            let nextView = segue.destination as! ChildViewController
            nextView.delegate = self
        }
    }
}

class ChildViewController: UIViewController {

    var image = UIImage(named: "newHello")
    var delegate: UpdateImageProtocol?

    @IBAction func changeImage(sender: UIButton) {
        delegate?.userIsDone(image: image!)
    }
}

关于swift - iOS - 如何通过子容器设置父 View Controller 的imageview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43015766/

相关文章:

ios - 如何正确隐藏容器 View ?

ios - ChildViewController View 进入然后消失

swift - 如何恢复 OSX 应用程序中的窗口位置?

swift - 如何在 Swift 3 的 TableViewController 中添加一个通用按钮

arrays - 快速在数组中的字典中搜索字符串

ios - 过渡到子 UINavigationController 时奇怪的导航栏动画

ios - Swift:如何通过 Storyboard而不是使用 XLPagerTabStrip 以编程方式显示 subview Controller

ios - 在 StoreKit 拒绝交易

ios - 无法使用委托(delegate)将数据从 MainViewController 发送到 ContainerView

ios - UIPageViewController 调整 subview 大小为自己预留空间