Как я могу убедиться, что после объявления делегата протокола в Swift 5.2 этот делегат не равен нулю при его вызове?

Я пытаюсь очистить текстовое поле в MainViewController из DetailViewController. У меня есть следующий код на Swift Playground.


import UIKit
import PlaygroundSupport

protocol DetailViewControllerDelegate: class {
    func bar()
}

class DetailViewController: UIViewController {

    var detailViewControllerDelegate: DetailViewControllerDelegate!

    override func loadView() {

        let view = UIView()
        view.backgroundColor = .white

        let button = UIButton()
        button.frame = CGRect(x: 100, y: 200, width: 180, height: 20)
        button.setTitle("Hello World!", for: .normal)
        button.backgroundColor = .blue

        button.addTarget(self, action: #selector(handlePress), for: .touchUpInside)

        view.addSubview(button)
        self.view = view

    }


    @objc func handlePress() {
        print("\(#function)")

        if let vrvc = detailViewControllerDelegate {
            vrvc.bar()
        } else {
            print("detailViewControllerDelegate is NIL")
        }
    }

}


class MainViewController : UIViewController, DetailViewControllerDelegate {
    func bar() {
        print("Inside Bar")
    }

    override func loadView() {
        let detailViewController = DetailViewController()
        detailViewController.detailViewControllerDelegate = self
    }

}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = DetailViewController()

Когда кнопка нажата, detailViewController равен нулю. Как я могу убедиться, что detailViewController НЕ равен нулю при нажатии кнопки?

1 ответ

У вас есть два разных DetailViewControllers:

    override func loadView() {
        let detailViewController = DetailViewController()

detailViewController теперь ссылается на новый экземпляр DetailViewController

        detailViewController.detailViewControllerDelegate = self
    }

}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = DetailViewController()

liveView теперь ссылается на новый экземпляр DetailViewControllerкоторый отличается от приведенного выше и в котором вы не установилиdetailViewControllerDelegate.

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

Тем не менее, второй экземпляр DetailViewController создается в операторе, который выглядит как попытка протестировать код на игровой площадке, поэтому, возможно, вам просто нужно подумать о том, как вы тестируете.

Другие вопросы по тегам