首页 文章

使用协议发送数据

提问于
浏览
1

我在使用协议将数据发送回以前的控制器时遇到问题 . 我研究过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 回答

  • 0

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

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

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

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

  • 1

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

    photoEditor =  PhotoEditorViewController()
    

    在尝试设置其委托之前 .

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

    weak var delegate: ImageEditorDelegate?
    

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

    protocol ImageEditorDelegate : class {
    

相关问题