【问题标题】:Swift 4 Delegate doesn't work from childViewControllerSwift 4 Delegate 在 childViewController 中不起作用
【发布时间】:2018-04-27 15:05:22
【问题描述】:

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

这是 ViewController (main) 的代码:

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()

    }

}

我做错了什么?

【问题讨论】:

    标签: swift macos delegates viewcontroller


    【解决方案1】:

    首先你这样说:

    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 并用另一个替换它!

    v1.delegate = self 行下移到你设置了vc1 的实际值。

    【讨论】:

    • 太棒了!!! :-) 我怀疑有一些简单的解决方案,但我没有那么简单 :-D 非常感谢!!! :-) :-) :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多