Изменение текста метки на главном контроллере после модального закрытого swift macOS - PullRequest
0 голосов
/ 02 мая 2020

Я использую делегаты, чтобы получить строковое значение из моего модального. Когда модальный закрывается, я пытаюсь обновить текст метки, используя эту строку. Однако я получаю сообщение об ошибке: Неожиданно обнаружен ноль при неявном развертывании необязательного значения: файл . Я не уверен, как это исправить. Я думаю, что это происходит, потому что представление еще не активно.

import Cocoa

class ViewControllerA: NSViewController, SomeDelegate {
    @IBOutlet weak var msgLabel: NSTextField!

    var s: String = "";

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func setDetails(s: String) {
        self.user = s;
        print("Notified", self.s) // <-- prints: Notified hello again
        msgLabel.stringValue = self.s <-- DOESN'T WORK
    }


    func showModal() -> Void {

        msgLabel.stringValue = "hello" // <--- WORKS
        let cbvc: NSViewController = {
            return self.storyboard!.instantiateController(withIdentifier: "ControllerBVC")
            as! NSViewController
        }()

        self.presentAsModalWindow(cbvc);
    }

    @IBAction func onBtn(_ sender: Any) {
        self.showModal();
    }
}

protocol SomeDelegate {
    func setDetails(s: String)
}


class ViewControllerB: NSViewController {

    @IBOutlet weak var textF: NSTextField!

    var delegate: SomeDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
        let vc = ViewControllerA()
        self.delegate = vc
    }

    @IBAction func onBtn(_ sender: Any) {
        DispatchQueue.main.async {
                        self.delegate?.setDetails(s: self.textF.stringValue)
                        self.dismiss("ControllerAVC")
                    }
    }
}

1 Ответ

2 голосов
/ 02 мая 2020

У вас есть ряд проблем.

В ViewControllerB.viewDidLoad вы присваиваете новый экземпляр ViewControllerA свойству delegate. Не делай этого. Ваш метод viewDidLoad должен выглядеть следующим образом:

override func viewDidLoad() {
    super.viewDidLoad()
}

В showModal методе ViewControllerA должен назначить себя в качестве делегата на ViewControllerB до того, как ViewControllerB будет представлен.

func showModal() -> Void {
    let cbvc: NSViewController = {
        let vc = self.storyboard!.instantiateController(withIdentifier: "ControllerBVC")
        as! ViewControllerB
        vc.delegate = self
        return vc
    }()

    self.presentAsModalWindow(cbvc);
}

В методе setDetails просто присвойте строку непосредственно текстовому полю:

func setDetails(s: String) {
    msgLabel.stringValue = s
}
...