我如何使用具有委托的类

时间:2012-02-21 18:12:52

标签: objective-c

基本上我要问的是,什么是代表,但我也一直在使用它?

代表们的逻辑流程是什么?我需要很好地解释一些事情,因此我的许多谷歌搜索和搜索网站都显示了它们的用途,但实际上并不是如何使用它们。

我有一个有委托的类,你可以调用一个函数请求委托作为参数。我应该做什么,在我的班级中构建一个重复的委托,传递它然后它们被链接?对于愚蠢的人的一些真正基本的解释将非常感激!

谢谢!

3 个答案:

答案 0 :(得分:1)

代理接收来自“委托”给他们的其他对象的消息,并对其进行操作。

我们以UITableView为例。它有一个UITableViewDelegate,其中要求另一个对象如何对某些事情采取行动,例如行高。

答案 1 :(得分:1)

委托是一组在一个单独的类中组合在一起的回调函数。为了帮助您理解一下,假设这个方法签名:

-[Foo doStuffWithInteger:(int)foo thenExecute:void (^block)(Foo*)]

(你知道块,对吗?)文档会告诉一旦方法的主要算法完成后,它将回调(执行)传递的块。

委托模式较旧,并且做的事情略有不同。使用委托模式,Foo类将改为使用这两种方法:

-[Foo setDelegate:(id)delegate]
-[Foo doStuffWithInteger:(int)foo]

doStuffWithInteger对象不是在Foo末尾调用块,而是调用委托上的方法。这意味着委托必须实现-[??? foo:(Foo*) completedStuffWithInteger:(int)]类能够使用的某种方法,例如Foo。需要回调的所有方法可能会在委托上调用不同的方法。

Objective-C中的委托通常允许您为类实现自定义行为,而无需对它们进行子类化。例如,CALayer的委托可以实现draw:inContext:方法,该方法在需要绘制图层时调用,并将为图层提供内容。

由于Objective-C是duck-typed,因此可以使用任何实现委托方法的类。

答案 2 :(得分:0)

基本上委托是id类型的变量,它们与协议“耦合”,这非常类似于Java或C#接口,除非协议可以指定您不必实现的可选方法。

因此,为了使用一个将作为委托的类实现这样的协议:

.h file:

MyClass <TheProtocol>

.m file

- (void)theMethodToImplement
{
 //The implementation
}

之后,必须通常像这样设置具有委托变量的类:

theDelegateClass.delegate = self; 

之后,“委托类”可以调用其他类上的已实现方法,如下所示:

[delegate theMethodToImplement];

对于不在关键字@optional之下的任何方法,您可以安全地执行此操作,对于在关键字@optional下面声明的协议中的方法,您应首先检查委托是否决定实施像这样的方法:

if ([delegate respondsToSelector:@selector(theOptionalMethod)])
[delegate theOptionalMethod];