Swift 4 Delegate 在 childViewController 中不起作用

Posted

技术标签:

【中文标题】Swift 4 Delegate 在 childViewController 中不起作用【英文标题】:Swift 4 Delegate doesn't work from 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()

    


我做错了什么?

【问题讨论】:

【参考方案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 非常感谢!!! :-) :-) :-)

以上是关于Swift 4 Delegate 在 childViewController 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

objc 中 id<delegate>这个类型在swift中怎么写

从 MainController 向 Delegate 发送消息 - Swift

Swift语言精要 - 浅谈代理模式(Delegate)

App.Delegate 从 ViewController 到 TabController Swift 5

无法在 App Delegate (Swift) 中更新 titleView 图像

Swift UIApplication.delegate 只能在主线程中使用