在Objective-C有点困惑于代表(Little confused on Delegates i

2019-07-04 00:56发布

我知道Objective-C的一个好一点的,我工作的一个iPhone SDK书(从OBJ - C的书,只是做了控制台程序来)。 它试图解释代表虽然它被送往,并没有真正理解它要表达的。 我对他们是什么有点困惑,当你会使用它们。

基本上,它说,他们是采取上代表其他对象做某些事情的责任类。

任何人都照顾到详细点吗?

谢谢!

Answer 1:

想想代表为反转依赖的方向。 在大多数的框架的客户端将注入所需的依赖到的情况下,通常是在构造函数或setter方法。

可可则相反; 实例,而请求数据时,并且如果它是需要的。

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

  • 有条件之前 -信号事情将要发生,但代表可能会中止。 名称总是包含这个词应该。
    例如: searchBar Should EndEditing:
  • 无条件前 -信号事即将发生。 名称始终包含Word将。
    例如: application Will Terminate:
  • 无条件后 -信号出事了。 名称总是包含单词一样。
    例如: application Did FinishLaunching:
  • 定制工具 -请求如何运作的信息。 名称包含所需的信息。
    实施例tableView: viewForHeaderInSection :

所有的委托方法总是有其发件人作为参数之一。 任何委托方法可能有改变发送者的行为方式返回值。



Answer 2:

比方说,你想与警报呈现给用户,并且你想有一个方法,当用户触摸按钮中的一个运行。 问题是,你怎么知道叫什么方法,其对象上,当有人触碰一个按钮?

为了一类是一个代表,你必须把它作为申报等。 在上面的例子中,假设你有控制应用程序的流程的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的参考文档是非常,非常好,所有的委托协议是相当自我解释。



Answer 3:

一个很好的方法,了解代表通过例子。 一个例子是UITableView (或NSTableView ,这取决于我们谈论iPhone或Mac OS)。 无论哪种方式,表视图具有delegate和一个dataSource (二者充当辅助对象的接收器)。

取而代之的UITableView处理事件时,例如,其行是由用户点击,它反而告诉其delegate “嘿!我已经拍了拍此行与这一节中,做你会的!”。 典型地, delegate是某种,它实现了正确的方法的控制器。 所以表视图(检查以查看是否后delegate发送消息这样实际上具有用于该方法的定义):

[delegate tableView:self didSelectRowAtIndexPath:indexPath];

由于您的控制器是表的委托,并实现了方法,它决定做什么。 当该方法完成(在这种情况下,它应该只返回void ),则继续执行对表视图。

委托是一个概念。 这不是的Objective-C的语言功能。 的delegate的UITableView的构件是像任何其他对象。 虽然,通常代表保留,它们代替分配(以避免retain周期)。

当你得到他们的窍门他们是非常方便的。 我建议用类似TableViews实例练习( NSTableView ,就像我前面说的,作品以类似的方式,只是用不同的方法)。



Answer 4:

委托(这意味着代表 )的是,希望也代表(继承)另一个不相关的类的类(的对象)。 的委托对象是能够从其它不相关的类继承的“符合”(具有用于一些实施方式中)不相关的类的所需的协议的方法,其指示给外国类该对象现在能够适当地截击其最基本的信息的。

当你想相关的类共享方法使用继承 。 当你想不相关的类共享方法您使用委托 。 委托方法可以让从一个类继承方法的对象从其它不相关的类。 的“委托对象”,或“代表目的”,是从外国类继承的对象; 它被指定为远程级的代表,一名代表,这样,当您分配一个对象作为代表的一类,你给它的权限,以表示该类还,即使它不能正常从该类继承。 (如果是从类继承,那么你就不会需要将其设置为该类的代表,它应该已经可以访问类的方法,但是你想要这个无关对象继承类的一些方法,代表。类,并且将一些信息反馈给其发送者类,所以你把它委托的代表,即使它从一组不同的类继承。这个类的),这实质上是让一个不相关的类从另一个无关的类继承,但有最小的并发症继承它的基本路线。

当你想要一个对象从一个单独的类执行代码中使用代理系统。 例如, 如这里所描述 ,当你点击在文本字段中输入,文本字段并不真正知道如何处理这些信息做。 它的作用是看它的委托对象的类(如文档的窗口控制器或文件),并使用这个类的一个符合文本字段的它的文本字段的委托协议,像textFieldShouldReturn中找到相应的方法的相关方法。 因此,在这种情况下,设置窗口控制器或文件作为文本字段的委托,因为该文本字段需要一个类来表示它被赋予的信息。

一类需要从B类的方法,但是A类不从类B.首先继承,告诉A类符合B类协议的编译器:

@interface ClassA : NSObject <ClassBDelegateProtocol>

在苹果文档,每类引用显示在顶部“从继承”和“符合”。 例如, NSDocumentController从继承NSObject和符合NSUserInterfaceValidationsNSCoding ,和NSObject(NSObject) 。 在符合NSCoding是从NSDocumentController.h接口声明

@interface NSDocumentController : NSObject <NSCoding>

NSUserInterfaceValidations从NSDocumentController.h方法声明

-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item;

随着#import

#import <AppKit/NSUserInterfaceValidation.h>

因此而NSDocumentController从继承NSObject它想一些帮助也 NSCodingNSUserInterfaceValidation 。 它由符合他们的协议方法定义本身符合这些方法 ,并导入任何必要的头文件使用这些方法得到的帮助来自这些外资类。



Answer 5:

看看我的委托设计模式,这里的教程: http://www.jonmsterling.com/blog/?p=74 。 我希望帮助。



Answer 6:

你并不孤单,我还在这个学习自己。 我认为最好的,如果我试图解释它在口头上,而不是代码。 有持有你要完成一定的方法或行动的协议。 委托方法需要从协议,以便能够使用它来促进的动作或方法。 我发现这篇文章是非常有益http://rypress.com/tutorials/objective-c/protocols 。 希望这可以帮助。



文章来源: Little confused on Delegates in Objective-C