0

我正在尝试从 DetailViewController 中清除 MainViewController 中的文本字段。我在 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 为 nil。当按下按钮时,如何确保 detailViewController 不为零?

4

1 回答 1

0

您有两个不同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.

如果您需要在一个地方创建 aDetailViewController并在另一个地方引用它,则需要将对它的引用存储在两个地方都可以访问的属性中。

也就是说,第二个实例DetailViewController是在一个看起来像是在 Playground 中测试代码的尝试中创建的,所以也许你只需要考虑你是如何测试的。

于 2020-06-02T23:40:26.293 回答