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
App.Delegate 从 ViewController 到 TabController Swift 5