我知道Objective-C的一些内容,而且我正在开发一本iPhone SDK书(来自Obj-C的一本书,它刚刚完成了控制台程序).它试图解释代表虽然它很匆忙,并没有真正理解它试图传达的内容.我对它们是什么以及何时使用它们感到有点困惑.
基本上它说它们是负责代表另一个对象做某些事情的类.
有人在意吗?
谢谢!
Pey*_*loW 20
将代理视为反转依赖的方向.在大多数框架中,客户端会将所需的依赖项注入到实例中,通常在构造函数中或由setter注入.
可可做了相反的事; 实例代替在需要时请求数据.
委托方法有四种主要类型:
searchBar
Should
EndEditing:
application
Will
Terminate:
application
Did
FinishLaunching:
tableView:
viewForHeaderInSection
:
所有委托方法始终将其发件人作为参数之一.任何委托方法都可能有一个返回值,可以改变发送方的行为方式.
假设您想要向用户显示警报,并且您希望在用户触摸其中一个按钮时运行方法.问题是,当有人触摸按钮时,你怎么知道调用什么方法,哪个对象?
为了使类成为委托,您必须声明它.在上面的示例中,假设您有一个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参考文档非常非常好,并且所有委托协议都非常自我解释.
理解代表的好方法是通过示例.一个例子是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的语言功能.delegate
UITableView 的成员就像任何其他对象一样.虽然代理人通常不会被保留,但他们会被分配(以避免retain
周期).
当你掌握它们时,它们非常方便.我建议练习像TableViews NSTableView
这样的例子(就像我之前说的那样,以类似的方式工作,只是使用不同的方法).