Swift 使用协议发送数据
我在使用协议将数据发送回以前的控制器时遇到问题。我研究了这么多问题和指南,但由于某种原因,我的数据没有被传回 在我的第二个类中,我创建了数据,这些数据稍后将被发送回第一个类:Swift 使用协议发送数据,swift,segue,protocols,Swift,Segue,Protocols,我在使用协议将数据发送回以前的控制器时遇到问题。我研究了这么多问题和指南,但由于某种原因,我的数据没有被传回 在我的第二个类中,我创建了数据,这些数据稍后将被发送回第一个类: protocol ImageEditorDelegate { func sendImage(image: UIImage, id: String) } class PhotoEditorViewController: UIViewController { var delegate: ImageEdit
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
}
}
}
但是什么也没发生,这个func永远不会被调用。我认为我的代表是零,或者是零,但是我如何解决这个问题呢?我也有,我正在使用VIPER作为架构,带有稍微定制的segues,这可能是问题所在吗?我尝试过简单的分段,但也有同样的问题
我知道这是一个相当简单的问题,但在阅读了有关协议的文章后,我不明白自己做错了什么
谢谢你的帮助 您需要实例化photoEditor,如
photoEditor = PhotoEditorViewController()
在尝试设置其委托之前
下一部分不必这样做,但我建议将委托变量设置为弱变量,以避免任何保留问题,如
weak var delegate: ImageEditorDelegate?
您需要将协议标记为类,如下所示
protocol ImageEditorDelegate : class {
你所做的是非常错误的。您有两个视图控制器,它们的属性相互引用:
class PhotoEditorViewController: UIViewController {
var delegate: ImageEditorDelegate?
}
class NewProductViewController: UIViewController, ImageEditorDelegate {
var imageEditor: PhotoEditorViewController?
}
这些都不是弱引用,所以如果你真的让它起作用-也就是说,如果你安排事情,使NewProductViewController的imageEditor
是一个PhotoEditorViewController,它的委托是NewProductViewController-你将有一个糟糕的保留周期和内存泄漏
这表明您尚未理解协议和委托模式。只有显示的视图控制器应具有指向演示者的委托
属性,并且该属性应为弱
。演示者不需要任何指向显示的视图控制器的属性,因为它显示了该视图控制器。请在您尝试设置其委托时证明imageEditor
不是nil
。您好,谢谢您的帮助。执行了所有动作,但仍然没有运气。Print没有接到电话…谢谢你的解释。因此,我应该将var-imageEditor:PhotoEditorViewController?
和imageEditor?.delegate=self
从NewProductViewController
中删除?并将委托设置为弱
。这仍然没有解决我的问题。或者我做错了什么?好吧,正如我在评论中所说的,你需要在某个时候有一些真实的东西,你可以设置的委托。你说的是imageEditor?.delegate=self
但我怎么知道此时的imageEditor
是什么?谢谢你的帮助,我终于成功了。是的,你是对的,我不明白它是怎么工作的。将不得不再次阅读这些文章。可能会帮助您下载一个简单的工作示例。整个示例项目都可以下载,但这两个文件是需要查看的:谢谢。那会让我更好地理解它