在没有 Segue 或程序化调用的情况下分配委托
Assign Delegate Without Segue or Programatic Call
我需要 VC3 才能发送 VC1 函数调用!
我了解委托的基础知识,我刚刚阅读了本指南,了解如何在没有 prepareForSegue 的情况下分配委托:
但是 如果两者之间有 VC 需要交谈怎么办?例如,VC1 表示 VC2,它表示 VC3。 VC3 希望 VC1 做一些工作。在 VC2 中没有 segue 和程序化 VC3 调用,我该如何完成此操作?
如果您想继续使用委托模式,您需要更新 VC2 以传递委托回调。
因此使用您发布的那个示例中的代码:
ViewControllerOne:
class ViewControllerOne: UIViewController,testProtocol {
@IBAction func btInit(sender: AnyObject) {
println("Bt Init")
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController2: ViewControllerTwo = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as ViewControllerTwo
viewController2.viewController1 = self
self.presentViewController(initViewController,animated: false, nil)
}
func testDelegate(){
println(" in my view controller delegate ")
}
}
ViewControllerTwo:
class ViewControllerTwo: UIViewController,testProtocol {
var viewController1: ViewControllerOne? = ViewControllerOne()
@IBAction func btInit(sender: AnyObject) {
println("Bt Init")
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController3: ViewControllerThree = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as ViewControllerThree
viewController3.delegate = viewController1
self.presentViewController(initViewController,animated: false, nil)
}
}
ViewControllerThree:
protocol testProtocol {
func testDelegate() // this function the first controllers
}
class ViewControllerThree: UIViewController {
@IBAction func BtTarget(sender: AnyObject) {
println("bt target pressed")
delegate?.testDelegate()
}
var delegate : testProtocol?
}
更好的选择
就我个人而言,我不喜欢这种方法,因为它在 ViewControllerTwo
上添加了来自其他两个需要通信的 VC 的不必要的耦合,因此 IMO 更好的替代方法是通过使用 Observer 模式NSNotification
以便 VC1 注册为通知的侦听器,然后在稍后的某个时候,VC3 发布通知(以及可选的任何数据),VC1 接收它并执行它需要的任何操作。
我需要 VC3 才能发送 VC1 函数调用!
我了解委托的基础知识,我刚刚阅读了本指南,了解如何在没有 prepareForSegue 的情况下分配委托:
但是 如果两者之间有 VC 需要交谈怎么办?例如,VC1 表示 VC2,它表示 VC3。 VC3 希望 VC1 做一些工作。在 VC2 中没有 segue 和程序化 VC3 调用,我该如何完成此操作?
如果您想继续使用委托模式,您需要更新 VC2 以传递委托回调。
因此使用您发布的那个示例中的代码:
ViewControllerOne:
class ViewControllerOne: UIViewController,testProtocol {
@IBAction func btInit(sender: AnyObject) {
println("Bt Init")
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController2: ViewControllerTwo = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as ViewControllerTwo
viewController2.viewController1 = self
self.presentViewController(initViewController,animated: false, nil)
}
func testDelegate(){
println(" in my view controller delegate ")
}
}
ViewControllerTwo:
class ViewControllerTwo: UIViewController,testProtocol {
var viewController1: ViewControllerOne? = ViewControllerOne()
@IBAction func btInit(sender: AnyObject) {
println("Bt Init")
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController3: ViewControllerThree = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as ViewControllerThree
viewController3.delegate = viewController1
self.presentViewController(initViewController,animated: false, nil)
}
}
ViewControllerThree:
protocol testProtocol {
func testDelegate() // this function the first controllers
}
class ViewControllerThree: UIViewController {
@IBAction func BtTarget(sender: AnyObject) {
println("bt target pressed")
delegate?.testDelegate()
}
var delegate : testProtocol?
}
更好的选择
就我个人而言,我不喜欢这种方法,因为它在 ViewControllerTwo
上添加了来自其他两个需要通信的 VC 的不必要的耦合,因此 IMO 更好的替代方法是通过使用 Observer 模式NSNotification
以便 VC1 注册为通知的侦听器,然后在稍后的某个时候,VC3 发布通知(以及可选的任何数据),VC1 接收它并执行它需要的任何操作。