我在使用协议将数据发送回以前的控制器时遇到问题 . 我研究过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 回答
你在做什么是非常错误的 . 您有两个具有彼此属性引用的视图控制器:
那些不是
weak
引用,所以如果你做到这一点 - 也就是说,如果你安排的东西让NewProductViewController的imageEditor
是一个PhotoEditorViewController,它的delegate
就是NewProductViewController - 你会有一个讨厌的保留周期和内存泄漏 .这表明您还没有理解协议和委托模式 . 只有呈现的视图控制器应该具有指向演示者的
delegate
属性,它应该是weak
. 演示者不需要任何指向所呈现的视图控制器的属性,因为它呈现了它 .你需要实例化你的photoEditor,比如
在尝试设置其委托之前 .
你不必在下一部分做这个,但是我建议把委托变量变成一个弱变量来避免任何保留问题,比如说
你需要将协议标记为类似的类