我知道Objective-C的一个好一点的,我工作的一个iPhone SDK书(从OBJ - C的书,只是做了控制台程序来)。 它试图解释代表虽然它被送往,并没有真正理解它要表达的。 我对他们是什么有点困惑,当你会使用它们。
基本上,它说,他们是采取上代表其他对象做某些事情的责任类。
任何人都照顾到详细点吗?
谢谢!
我知道Objective-C的一个好一点的,我工作的一个iPhone SDK书(从OBJ - C的书,只是做了控制台程序来)。 它试图解释代表虽然它被送往,并没有真正理解它要表达的。 我对他们是什么有点困惑,当你会使用它们。
基本上,它说,他们是采取上代表其他对象做某些事情的责任类。
任何人都照顾到详细点吗?
谢谢!
想想代表为反转依赖的方向。 在大多数的框架的客户端将注入所需的依赖到的情况下,通常是在构造函数或setter方法。
可可则相反; 实例,而请求数据时,并且如果它是需要的。
主要有四种类型的委托方法:
searchBar
Should
EndEditing:
application
Will
Terminate:
。 application
Did
FinishLaunching:
tableView:
viewForHeaderInSection
:
。 所有的委托方法总是有其发件人作为参数之一。 任何委托方法可能有改变发送者的行为方式返回值。
比方说,你想与警报呈现给用户,并且你想有一个方法,当用户触摸按钮中的一个运行。 问题是,你怎么知道叫什么方法,其对象上,当有人触碰一个按钮?
为了一类是一个代表,你必须把它作为申报等。 在上面的例子中,假设你有控制应用程序的流程的ApplicationController的对象。 在声明中,我们会说
@interface ApplicationController : NSObject <UIAlertViewDelegate>
这告诉ApplicationController的是要落实在UIAlertViewDelegate协议的一些方法的编译器。 我们期待该协议我们的文档中,看的方法的列表。 当我们想要做的东西时,按下按钮,我们可以看到:
alertView:clickedButtonAtIndex:
-当用户点击警报视图按钮发送到委托。 这种方法是可选的。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
因此,如果我们实施的ApplicationController的方法称为alertView:clickedButtonAtIndex
,创建一个ApplicationController的对象,然后设置对象为大家展示警报的委托,一切设置完毕。 只要有人压在警报的按钮时, alertView:clickedButtonAtIndex
方法将被调用,传入alertView并按下按钮的索引。
这可以让你做任何你想要处理这些信息。 一个简单的case语句:
if( buttonIndex == 0 ) {
_myString = @"Pressed the button";
} else {
_myString = @"Pressed the other button";
}
Objective-C的参考文档是非常,非常好,所有的委托协议是相当自我解释。
一个很好的方法,了解代表通过例子。 一个例子是UITableView
(或NSTableView
,这取决于我们谈论iPhone或Mac OS)。 无论哪种方式,表视图具有delegate
和一个dataSource
(二者充当辅助对象的接收器)。
取而代之的UITableView
处理事件时,例如,其行是由用户点击,它反而告诉其delegate
“嘿!我已经拍了拍此行与这一节中,做你会的!”。 典型地, delegate
是某种,它实现了正确的方法的控制器。 所以表视图(检查以查看是否后delegate
发送消息这样实际上具有用于该方法的定义):
[delegate tableView:self didSelectRowAtIndexPath:indexPath];
由于您的控制器是表的委托,并实现了方法,它决定做什么。 当该方法完成(在这种情况下,它应该只返回void
),则继续执行对表视图。
委托是一个概念。 这不是的Objective-C的语言功能。 的delegate
的UITableView的构件是像任何其他对象。 虽然,通常代表不保留,它们代替分配(以避免retain
周期)。
当你得到他们的窍门他们是非常方便的。 我建议用类似TableViews实例练习( NSTableView
,就像我前面说的,作品以类似的方式,只是用不同的方法)。
委托(这意味着代表 )的是,希望也代表(继承)另一个不相关的类的类(的对象)。 的委托对象是能够从其它不相关的类继承的“符合”(具有用于一些实施方式中)不相关的类的所需的协议的方法,其指示给外国类该对象现在能够适当地截击其最基本的信息的。
当你想相关的类共享方法使用继承 。 当你想不相关的类共享方法您使用委托 。 委托方法可以让从一个类继承方法的对象从其它不相关的类。 的“委托对象”,或“代表目的”,是从外国类继承的对象; 它被指定为远程级的代表,一名代表,这样,当您分配一个对象作为代表的一类,你给它的权限,以表示该类还,即使它不能正常从该类继承。 (如果是从类继承,那么你就不会需要将其设置为该类的代表,它应该已经可以访问类的方法,但是你想要这个无关对象继承类的一些方法,代表。类,并且将一些信息反馈给其发送者类,所以你把它委托的代表,即使它从一组不同的类继承。这个类的),这实质上是让一个不相关的类从另一个无关的类继承,但有最小的并发症继承它的基本路线。
当你想要一个对象从一个单独的类执行代码中使用代理系统。 例如, 如这里所描述 ,当你点击在文本字段中输入,文本字段并不真正知道如何处理这些信息做。 它的作用是看它的委托对象的类(如文档的窗口控制器或文件),并使用这个类的一个符合文本字段的它的文本字段的委托协议,像textFieldShouldReturn中找到相应的方法的相关方法。 因此,在这种情况下,设置窗口控制器或文件作为文本字段的委托,因为该文本字段需要一个类来表示它被赋予的信息。
一类需要从B类的方法,但是A类不从类B.首先继承,告诉A类符合B类协议的编译器:
@interface ClassA : NSObject <ClassBDelegateProtocol>
在苹果文档,每类引用显示在顶部“从继承”和“符合”。 例如, NSDocumentController
从继承NSObject
和符合NSUserInterfaceValidations
, NSCoding
,和NSObject(NSObject)
。 在符合NSCoding
是从NSDocumentController.h接口声明
@interface NSDocumentController : NSObject <NSCoding>
并NSUserInterfaceValidations
从NSDocumentController.h方法声明
-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item;
随着#import
#import <AppKit/NSUserInterfaceValidation.h>
因此而NSDocumentController
从继承NSObject
, 它想一些帮助也 NSCoding
和NSUserInterfaceValidation
。 它由符合他们的协议方法 , 定义本身符合这些方法 ,并导入任何必要的头文件使用这些方法得到的帮助来自这些外资类。
看看我的委托设计模式,这里的教程: http://www.jonmsterling.com/blog/?p=74 。 我希望帮助。
你并不孤单,我还在这个学习自己。 我认为最好的,如果我试图解释它在口头上,而不是代码。 有持有你要完成一定的方法或行动的协议。 委托方法需要从协议,以便能够使用它来促进的动作或方法。 我发现这篇文章是非常有益http://rypress.com/tutorials/objective-c/protocols 。 希望这可以帮助。