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
是什么?谢谢你的帮助,我终于成功了。是的,你是对的,我不明白它是怎么工作的。将不得不再次阅读这些文章。可能会帮助您下载一个简单的工作示例。整个示例项目都可以下载,但这两个文件是需要查看的:谢谢。那会让我更好地理解它