我正在学习斯威夫特,而我正在研究代表团模式。 我想我完全理解什么是授权以及它是如何工作的,但我有一个问题。
我遇到控制器A是控制器B的委托的情况。
在控制器B中,我定义了一个委托协议。 在控制器B中,我设置了一个变量委托(可选) 在控制器B中,当代理发生某些事情时,我会发送消息 控制器A必须采用我的协议方法成为代表
我无法理解每个委托控制器(在这种情况下为A)是否监听控制器B发送的消息,或者如果我必须告诉控制器B A现在是他的委托。
我注意到有人使用此代码(在控制器A中)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Example" {
let navigationController = segue.destinationViewController as UINavigationController
let controller = navigationController.topViewController as AddItemViewController
controller.delegate = self
}
}
这是告诉代表谁是他的代表的唯一方法吗?
答案 0 :(得分:0)
我相信,你需要告诉一个deligator谁是它的代表创建它。现在,可以以编程方式或通过故事板创建委派者。因此,基于您有两个选项,您可以通过编程方式或IB中的方式,以编程方式告诉它谁是其委托人。
这里的关键在于创造。让我解释一下自己。以UIView为例。比如,你想要一个Custom UIView对象(CustomView)。因此,您将UIView拖放到View Controller中并在身份检查器中,将其类分配给CustomView的类。因此,基本上,只要创建控制器,您的自定义视图也将被创建。现在,您可以说创建它的View Controller是其委托,或者您可以转到IB并将视图的委托连接到View Controller。
现在,让我们假设您希望以编程方式在ViewController中创建自定义视图。在这种情况下,您可能会调用 - initWithFrame:
方法来创建视图,并在创建时告诉委托人谁是其委托人 -
myCustomView.delegate = self;
与View Controller相同。
controller.delegate = self;
因此,基本上要告诉作为其委托的委托人,首先需要创建委托人。至少,这就是我的想法。
答案 1 :(得分:0)
我认为代表团最好的例子之一是UITableView
。
每当您想要控制tableView的各种属性时,例如rowHeight等,您将控制器设置为tableview的delegate
。要设置tableView的delegate
,您需要创建tableView,这显然是由@natasha指出的。
因此,在您的情况下,您可以在创建委托人时设置委托人的委托,或者当您发现需要将委托人委托给委托人时,但您肯定需要让委托人出席以设置其属性。
您可以在需要控制时随时将控制器设置为delegate
。
答案 2 :(得分:0)
我确定您希望UIViewController
按照描述的方式行事,但这里有一个更简单的示例,如何将委托模式与自定义类一起使用:
protocol ControllerBDelegate: class {
func somethingHappendInControllerB(value: String)
/* not optional here and passes a value from B to A*/
/* forces you to implement the function */
}
class ControllerB {
var delegate: ControllerBDelegate?
private func someFunctionThatDoSomethingWhenThisControllerIsAlive() {
/* did some magic here and now I want to tell it to my delegate */
self.delegate?.somethingHappendInControllerB(value: "hey there, I'm a magician")
}
func doSomething() {
/* do something here */
self.someFunctionThatDoSomethingWhenThisControllerIsAlive()
/* call the function so the magic can really happen in this example */
}
}
class ControllerA: ControllerBDelegate {
let controllerB = ControllerB()
init() {
self.controllerB.delegate = self /* lets say we add here our delegate*/
self.controllerB.doSomething() /* tell your controller B to do something */
}
func somethingHappendInControllerB(value: String) {
print(value) /* should print "hey there, I'm a magician" */
}
}
我从脑海中编写代码并没有对其进行测试,但您应该了解如何使用这种模式。