Отправка данных с использованием протоколов - PullRequest
0 голосов
/ 18 октября 2018

У меня проблемы с использованием протоколов для отправки данных обратно на предыдущий контроллер.Я изучил ТАК вопросы и руководства, но по какой-то причине мои данные не возвращаются обратно.

Во втором классе я создаю данные, которые позже отправляются обратно в первый класс:

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 в качестве архитектуры со слегка настроенными сегментами, это может быть проблемой?Я пробовал простые переходы, но у меня была та же проблема.

Я понимаю, что это довольно простой вопрос, но я не мог понять, что я делаю неправильно, после того, как я прочитал статьи о протоколах.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

То, что вы делаете, очень неправильно.У вас есть два контроллера представления со ссылками на свойства друг друга:

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

Это не weak ссылки, так что если вы когда-нибудь заставите это работать - то есть, если вы когда-нибудь упорядочите вещи так, чтобыNewProductViewController imageEditor - это PhotoEditorViewController, чей delegate - это NewProductViewController - у вас будет неприятный цикл сохранения и утечка памяти.

Это говорит о том, что вы не поняли шаблон протокола и делегата.Только представленный контроллер представления должен иметь свойство delegate, указывающее на докладчика, и оно должно быть weak.Презентатор не нуждается ни в каком свойстве, указывающем на представленный контроллер представления, потому что он представляет его.

0 голосов
/ 19 октября 2018

вам нужно создать экземпляр вашего photoEditor, например

photoEditor =  PhotoEditorViewController() 

, прежде чем пытаться установить его делегата.

вам не нужно делать следующую часть, но я бы предложил сделатьделегируйте переменную как слабую переменную, чтобы избежать проблем с сохранением, например,

weak var delegate: ImageEditorDelegate?

, и вам нужно будет пометить протокол как класс, например

protocol ImageEditorDelegate : class {
...