Swift 委托 2 个容器视图进行通信
Swift delegate for 2 container views to communicate
在故事板 "parent" 场景及其 parentVC.swift 中,有 2 个带有嵌入式转场的 containerVC,每个转场 containerVC.swift。
在 container1 中,按钮操作调用父自定义方法。
(self.parentViewController as? parentVC)?.parentCustomFunc()
调用container2自定义方法。
func parentCustomFunc(){
self.container2.customFunc()
}
我读了很多书,但还不明白如何在这种情况下应用委托。
这是我在 parentVC.swift
中记录的 segue 块
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let container1VC = segue.destinationViewController as? Cont_1 {
self.container1 = container1VC
} else if let topVC = segue.destinationViewController as? TopVC {
self.container2 = container2VC
}
}
哪个容器应该实施该协议?
他们中的哪一个持有 var 呢?如何让 prepareForSegue 使用委托?
谢谢
您应该为每个 ChildViewController
创建两个协议。
也许是这样的:
protocol Child1Delegate {
func userTapOnChild1()
}
protocol Child2Delegate {
func userTapOnChild2()
}
并且在每个控制器中您可以创建实例:
var delegate: Child2Delegate!
var delegate : Child1Delegate!
在 Parent 控制器中,您实现 prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
以将委托分配给 child:
//You get right identifier of segue you named on storyboard
if segue.identifier == "SegueChild1" {
let controller = segue.destinationViewController as! Child1ViewController
controller.delegate = self
}
if segue.identifier == "SegueChild2" {
let controller = segue.destinationViewController as!Child2ViewController
controller.delegate = self
}
当您从 child 执行操作时,您可以调用 Parent 的委托通知:
@IBAction func child1ButtonIsTapped(sender: AnyObject) {
if let _delegate = delegate {
_delegate.userTapOnChild1()
}
}
Parent 将实现委托并做一些需要的事情:
func userTapOnChild1() {
let alertController = UIAlertController(title: "Child1", message: "I come from child 1", preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alertController.addAction(action)
self.presentViewController(alertController, animated: true, completion: nil)
}
具体可以参考我这个案例的demo:Demo
在故事板 "parent" 场景及其 parentVC.swift 中,有 2 个带有嵌入式转场的 containerVC,每个转场 containerVC.swift。
在 container1 中,按钮操作调用父自定义方法。
(self.parentViewController as? parentVC)?.parentCustomFunc()
调用container2自定义方法。
func parentCustomFunc(){
self.container2.customFunc()
}
我读了很多书,但还不明白如何在这种情况下应用委托。
这是我在 parentVC.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let container1VC = segue.destinationViewController as? Cont_1 {
self.container1 = container1VC
} else if let topVC = segue.destinationViewController as? TopVC {
self.container2 = container2VC
}
}
哪个容器应该实施该协议?
他们中的哪一个持有 var 呢?如何让 prepareForSegue 使用委托?
谢谢
您应该为每个 ChildViewController
创建两个协议。
也许是这样的:
protocol Child1Delegate {
func userTapOnChild1()
}
protocol Child2Delegate {
func userTapOnChild2()
}
并且在每个控制器中您可以创建实例:
var delegate: Child2Delegate!
var delegate : Child1Delegate!
在 Parent 控制器中,您实现 prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
以将委托分配给 child:
//You get right identifier of segue you named on storyboard
if segue.identifier == "SegueChild1" {
let controller = segue.destinationViewController as! Child1ViewController
controller.delegate = self
}
if segue.identifier == "SegueChild2" {
let controller = segue.destinationViewController as!Child2ViewController
controller.delegate = self
}
当您从 child 执行操作时,您可以调用 Parent 的委托通知:
@IBAction func child1ButtonIsTapped(sender: AnyObject) {
if let _delegate = delegate {
_delegate.userTapOnChild1()
}
}
Parent 将实现委托并做一些需要的事情:
func userTapOnChild1() {
let alertController = UIAlertController(title: "Child1", message: "I come from child 1", preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alertController.addAction(action)
self.presentViewController(alertController, animated: true, completion: nil)
}
具体可以参考我这个案例的demo:Demo