Swift 4 委托在 childViewController 中不起作用

Swift 4 Delegate doesn't work from childViewController

我必须编写简单的程序。只有一个登录屏幕等待一些密码,并在设置适当的密码后,将屏幕更改为 "program itself" 及其功能。 我决定通过容器视图及其子视图来完成。一切正常,但应负责触发此更改的委托没有响应。在我尝试过的任何选项中,都没有任何改变...它仍然没有响应。

这是 ViewController(主要)的代码:

import Cocoa

class ViewController: NSViewController {

        @IBOutlet weak var container: NSView!

        var vc1 : ViewController1 = ViewController1()
        var vc2 : ViewController2 = ViewController2()

        override func viewDidLoad() {
            super.viewDidLoad()

            //initialise of delegate:
            vc1.delegate = self

            // set subviews:
            vc1 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController1")) as! ViewController1
            vc2 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController2")) as! ViewController2
            self.addChildViewController(vc1)
            self.addChildViewController(vc2)

            // set first view:
            vc1.view.frame = self.container.bounds
            self.container.addSubview(vc1.view)
        }

        func changeViews()
        {
            for sView in self.container.subviews {
                sView.removeFromSuperview()
            }

            // set second view:
            vc2.view.frame = self.container.bounds
            self.container.addSubview(vc2.view)
        }
    }

    extension ViewController: ViewController1_Delegate {
        func passwdEntered(_ correctPasswd: Bool) {
            if correctPasswd == true{
                changeViews()
            }
        }
    }

这是第一个(子视图)ViewController 代码,我在其中输入密码:

import Cocoa

protocol ViewController1_Delegate: class {
    func passwdEntered(_ correctPasswd: Bool)
}

class ViewController1: NSViewController{

    @IBOutlet weak var passwordField: PasswordField!

    weak var delegate: ViewController1_Delegate?

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

    @IBAction func passwordFIeldEdited(_ sender: PasswordField) {
        delegate?.passwdEntered(true/*for testing purpose always true*/)
    }
}

最后第二个(子视图)ViewController代码:

import Cocoa

class ViewController2: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

    }

}

我做错了什么?

首先你这样说:

var vc1 : ViewController1 = ViewController1()
override func viewDidLoad() {
    super.viewDidLoad()
    vc1.delegate = self

那你这样说:

    vc1 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), 
                       bundle: nil).instantiateController(
                           withIdentifier: NSStoryboard.SceneIdentifier(
                               rawValue: "ViewController1")) as! ViewController1

因此,您将自己设置为 ViewController1 实例的委托,但随后在下一行中,您丢弃 ViewController1 并将其替换为另一个!

在设置 vc1.

的实际值后,将行 v1.delegate = self 向下移动到