使用协议发送数据

我在使用协议将数据发送回以前的控制器时遇到问题 . 我研究过SO问题和指南,但由于某种原因,我的数据不会被转回 .

在我的第二课中,我创建了数据,后来被发送回第一堂课:

protocol ImageEditorDelegate {
    func sendImage(image: UIImage, id: String)
}

class PhotoEditorViewController: UIViewController { 

    var delegate: ImageEditorDelegate?

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

@IBAction func didPressSave(_ sender: UIButton) {
        delegate?.sendImage(image: finalImage, id: imageThatWasSelected)
        self.dismiss(animated: true, completion: nil)
    }

}

在我的接收课上,我有:

class NewProductViewController: UIViewController, ImageEditorDelegate { 

    var imageEditor: PhotoEditorViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        imageEditor?.delegate = self
    }

func sendImage(image: UIImage, id: String) {
        print("Receiving images", image, id)
        switch id {
        case "1":
            selectedImages[1] = image
            productImage1.image = image
        case "2":
            selectedImages[2] = image
            productImage2.image = image
        case "3":
            selectedImages[3] = image
            productImage3.image = image
        default:
            break
        }
    }
}

但没有任何反应,这个功能永远不会被调用 . 我认为我的代表是零或者左右,但我怎么能解决这个问题呢?我也有,我使用VIPER作为具有轻微定制的segues的架构,这可能是问题吗?我尝试过简单的segues,但也有同样的问题 .

我知道这是一个相当简单的问题,但在阅读有关协议的文章后,我无法理解我做错了什么 .

谢谢你的帮助!

回答(2)

3 years ago

你在做什么是非常错误的 . 您有两个具有彼此属性引用的视图控制器:

class PhotoEditorViewController: UIViewController { 
    var delegate: ImageEditorDelegate?
}
class NewProductViewController: UIViewController, ImageEditorDelegate { 
    var imageEditor: PhotoEditorViewController?
}

那些不是 weak 引用,所以如果你做到这一点 - 也就是说,如果你安排的东西让NewProductViewController的 imageEditor 是一个PhotoEditorViewController,它的 delegate 就是NewProductViewController - 你会有一个讨厌的保留周期和内存泄漏 .

这表明您还没有理解协议和委托模式 . 只有呈现的视图控制器应该具有指向演示者的 delegate 属性,它应该是 weak . 演示者不需要任何指向所呈现的视图控制器的属性,因为它呈现了它 .

3 years ago

你需要实例化你的photoEditor,比如

photoEditor =  PhotoEditorViewController()

在尝试设置其委托之前 .

你不必在下一部分做这个,但是我建议把委托变量变成一个弱变量来避免任何保留问题,比如说

weak var delegate: ImageEditorDelegate?

你需要将协议标记为类似的类

protocol ImageEditorDelegate : class {