Swift;委托嵌入式视图控制器和父级
Swift; delegate embedded view controller and parent
提前抱歉,我无法很好地解释自己。我对编程真的很陌生,委托的话题仍然让我难以理解。我曾经有过一些很棒的 ,但现在我试图在不同的情况下使用委托,但我做不好。我拼凑了一些不起作用的代码,无论我搜索多少,我都找不到修复它的方法。
我在容器视图中有一个带有嵌入式视图控制器 (EmbeddedController) 的视图控制器 (MainController)。我试图让嵌入式控制器中的按钮操纵容器视图 (containerView)。
嵌入式控制器:
protocol ControllerDelegate {
func hideContainerView()
}
class EmbeddedController: UIViewController {
var delegate: VControllerDelegate?
@IBAction func button(sender: AnyObject) {
delegate?.hideContainerView()
}
}
主控制器:
class MainController: UIViewController, ControllerDelegate {
@IBOutlet var containerView: UIView!
func hideContainerView() {
containerView.hidden = true
}
override func viewDidLoad() {
super.viewDidLoad()
var vc = EmbeddedController()
vc.delegate = self
}
}
有人知道我做错了什么吗?为什么这不起作用?
首先要避免强引用循环:
protocol ControllerDelegate: class {
func hideContainerView()
}
class EmbeddedController: UIViewController {
weak var delegate: ControllerDelegate?
而且您还没有将新实例化的 VC 视图添加到容器视图中,也没有将其添加为子视图 VC:
let vc = EmbeddedController()
vc.delegate = self
containerView.addSubview(vc.view)
self.addChildViewController(vc)
vc.didMoveToParentViewController(self)
我最后做的是将它添加到 MainController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "mySegue") {
let vc = segue.destinationViewController as! EmbeddedController
vc.delegate = self
}
}
在情节提要中,我选择了从 MainController 到 EmbeddedController 的 segue,并将标识符设置为 "mySegue"。
如果没有上面的代码,委托就会一直返回 nil。一开始我没有研究这个解决方案,因为我认为 segues 仅用于视图控制器之间的转换,而且在我看来,我没有将嵌入式控制器视为转换。也许比我更有见识的人(此时几乎是这里的任何人)可以解释这一切是如何组合在一起的。
无论如何,这就是我解决问题的方法,希望其他人也能从中受益:)
提前抱歉,我无法很好地解释自己。我对编程真的很陌生,委托的话题仍然让我难以理解。我曾经有过一些很棒的
我在容器视图中有一个带有嵌入式视图控制器 (EmbeddedController) 的视图控制器 (MainController)。我试图让嵌入式控制器中的按钮操纵容器视图 (containerView)。
嵌入式控制器:
protocol ControllerDelegate {
func hideContainerView()
}
class EmbeddedController: UIViewController {
var delegate: VControllerDelegate?
@IBAction func button(sender: AnyObject) {
delegate?.hideContainerView()
}
}
主控制器:
class MainController: UIViewController, ControllerDelegate {
@IBOutlet var containerView: UIView!
func hideContainerView() {
containerView.hidden = true
}
override func viewDidLoad() {
super.viewDidLoad()
var vc = EmbeddedController()
vc.delegate = self
}
}
有人知道我做错了什么吗?为什么这不起作用?
首先要避免强引用循环:
protocol ControllerDelegate: class {
func hideContainerView()
}
class EmbeddedController: UIViewController {
weak var delegate: ControllerDelegate?
而且您还没有将新实例化的 VC 视图添加到容器视图中,也没有将其添加为子视图 VC:
let vc = EmbeddedController()
vc.delegate = self
containerView.addSubview(vc.view)
self.addChildViewController(vc)
vc.didMoveToParentViewController(self)
我最后做的是将它添加到 MainController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "mySegue") {
let vc = segue.destinationViewController as! EmbeddedController
vc.delegate = self
}
}
在情节提要中,我选择了从 MainController 到 EmbeddedController 的 segue,并将标识符设置为 "mySegue"。
如果没有上面的代码,委托就会一直返回 nil。一开始我没有研究这个解决方案,因为我认为 segues 仅用于视图控制器之间的转换,而且在我看来,我没有将嵌入式控制器视为转换。也许比我更有见识的人(此时几乎是这里的任何人)可以解释这一切是如何组合在一起的。
无论如何,这就是我解决问题的方法,希望其他人也能从中受益:)