Протокольный делегат между XIB и View Controller - PullRequest
1 голос
/ 18 апреля 2019

Итак, у меня есть XIB View и View Controller. Я хочу, чтобы при нажатии кнопки в моем XIB (didTapTryAgain Button) вызывалась функция из моего контроллера представления. Затем я попытался создать протокол и делегировать класс. Но это все еще не вызвало мою функцию. Вот мой класс просмотра XIB:

import UIKit

protocol ErrorMessageDelegate {
    func refresh(_sender: AnyObject)
}

class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    static weak var shared: ErrorMessage?
    var delegate: ErrorMessageDelegate?
    static var message: String?

    override func awakeFromNib() {
        ErrorMessage.shared = self
        labelError.text = ErrorMessage.message
    }

    @IBAction func didTapTryAgain(_ sender: UIButton) {
        delegate?.refresh(_sender: buttonTryAgain)
    }
}

А вот мой класс View Controller:

import Foundation

class BaseViewController: UIViewController, ErrorMessageDelegate {

    func refresh(_sender: AnyObject) {
        print("I hope my function work here")
    }

    var uiView =  UIView();

    override func viewDidLoad() {
        super.viewDidLoad()
        ErrorMessage.shared?.delegate = self
    }

    func getErrorMessage(message:String) {
        super.viewDidLoad()
        Dialog.dismiss()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
        self.view.addSubview(viewErrorMessage)
    }
}

Я слежу за этим ответом за мой код, и он все еще не работает. Кто-нибудь знает как это сделать? Спасибо!

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Просто используйте этот код, тогда ваш метод делегата будет вызываться.

  func getErrorMessage(message:String) {
    ErrorMessage.message = message
    guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
    viewErrorMessage.delegate = self
    self.view.addSubview(viewErrorMessage)
}

и вызывать метод везде, где вы хотите открыть всплывающее окно

getErrorMessage(message: "Test Message")
1 голос
/ 18 апреля 2019

Ваша проблема в том, что вы устанавливаете делегата для общего экземпляра здесь

ErrorMessage.shared?.delegate = self / here shared?. is nil

но здесь

guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
self.view.addSubview(viewErrorMessage)

вы создаете отдельный экземпляр и добавляете его

Вам нужно

var viewErrorMessage:ErrorMessage! // add to the vc

viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as! ErrorMessage 
viewErrorMessage.delegate = self
self.view.addSubview(viewErrorMessage)

Также полностью избавился от

static weak var shared: ErrorMessage?
...