对Objective-C中的代表有点困惑

12 delegates objective-c

我知道Objective-C的一些内容,而且我正在开发一本iPhone SDK书(来自Obj-C的一本书,它刚刚完成了控制台程序).它试图解释代表虽然它很匆忙,并没有真正理解它试图传达的内容.我对它们是什么以及何时使用它们感到有点困惑.

基本上它说它们是负责代表另一个对象做某些事情的类.

有人在意吗?

谢谢!

Pey*_*loW 20

将代理视为反转依赖的方向.在大多数框架中,客户端会将所需的依赖项注入到实例中,通常在构造函数中或由setter注入.

可可做了相反的事; 实例代替在需要时请求数据.

委托方法有四种主要类型:

  • 有条件地之前 - 信号即将发生,但代表可能会中止.名称始终包含单词"应".
    示例:.searchBarShouldEndEditing:
  • 无条件之前 - 信号即将发生.名称始终包含单词will.
    示例:.applicationWillTerminate:
  • 无条件后 - 信号发生了什么.名称总是包含单词did.
    示例:.applicationDidFinishLaunching:
  • 定制器 - 请求有关如何运行的信息.名称包含所需的信息.
    例子.tableView:viewForHeaderInSection:

所有委托方法始终将其发件人作为参数之一.任何委托方法都可能有一个返回值,可以改变发送方的行为方式.


joh*_*188 7

假设您想要向用户显示警报,并且您希望在用户触摸其中一个按钮时运行方法.问题是,当有人触摸按钮时,你怎么知道调用什么方法,哪个对象?

为了使类成为委托,您必须声明它.在上面的示例中,假设您有一个ApplicationController对象来控制应用程序的流程.在声明中,我们会说

@interface ApplicationController : NSObject <UIAlertViewDelegate>
Run Code Online (Sandbox Code Playgroud)

这告诉编译器ApplicationController将在UIAlertViewDelegate协议中实现一些方法.我们在文档中查看该协议,并查看方法列表.由于我们想在按下按钮时执行某些操作,我们会看到:

alertView:clickedButtonAtIndex: - 当用户单击警报视图上的按钮时发送给代理.此方法是可选的.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

因此,如果我们在ApplicationController中实现一个被调用的方法alertView:clickedButtonAtIndex,创建一个ApplicationController对象,然后将该对象设置为我们显示的警报的委托,则设置一切.只要有人按下警报上的按钮,alertView:clickedButtonAtIndex就会调用该方法,传入alertView并按下按钮的索引.

这允许您使用该信息执行任何操作.一个简单的案例陈述:

if( buttonIndex == 0 ) {
    _myString = @"Pressed the button";
} else {
    _myString = @"Pressed the other button";
}
Run Code Online (Sandbox Code Playgroud)

Objective-C参考文档非常非常好,并且所有委托协议都非常自我解释.


jbr*_*nan 6

理解代表的好方法是通过示例.一个例子是UITableView(或者NSTableView,取决于我们是在谈论iPhone还是Mac OS).无论哪种方式,表视图都有a delegate和a dataSource(两者都充当接收器的辅助对象).

而不是UITableView处理事件时,例如,其行是由用户点击,它反而告诉它delegate:"嘿!我已经拍了拍此行与这一节中,做你会的!".通常,它delegate是某种控制器,它实现了正确的方法.所以表视图(在检查delegate实际上是否有方法的定义之后)发送如下消息:

[delegate tableView:self didSelectRowAtIndexPath:indexPath];
Run Code Online (Sandbox Code Playgroud)

由于您的Controller是表的委托,并且它实现了该方法,因此它决定了该做什么.当方法完成时(在这种情况下它应该只返回void),然后在表视图上继续执行.

代表是一个概念.它不是Objective-C的语言功能.delegateUITableView 的成员就像任何其他对象一样.虽然代理人通常不会被保留,但他们会被分配(以避免retain周期).

当你掌握它们时,它们非常方便.我建议练习像TableViews NSTableView这样的例子(就像我之前说的那样,以类似的方式工作,只是使用不同的方法).