Как я могу убедиться, что после объявления делегата протокола в 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 ответ
У вас есть два разных DetailViewController
s:
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
создается в операторе, который выглядит как попытка протестировать код на игровой площадке, поэтому, возможно, вам просто нужно подумать о том, как вы тестируете.