iOS代表的目的是什么?

时间:2011-08-13 20:00:55

标签: ios

我理解delegate在iOS中的作用,我看过示例代码,但我只是想知道这种封装的优点(而不是在主对象中包含委托方法) )。

12 个答案:

答案 0 :(得分:16)

委托设计模式的优点是松散耦合。它使类A(委托)依赖于类B(委托类),而类B不必具有类A的任何知识。这确保了依赖关系只是单向的,而不是循环的。

它还构成了Apple框架的基础(小写“f”),因为它允许它们在需要特定于您的应用程序的功能时适当地调用您的代码。例如,响应按钮点击或告诉表格查看应该有多少部分。

答案 1 :(得分:11)

代表团是design pattern,不仅在iOS中使用,还在许多其他语言中使用。它使您能够在类层次结构中处理值和消息。

答案 2 :(得分:9)

在iOS中,委托需要“委托”类来实现包含“委托”知道的方法的协议。还在关注?

委托类的实现将调用这些协议方法,但委托类将在其类中实现这些方法。

这样可以保持您的课程清洁。

实际上,如果可以向单个类添加新方法,则不需要委派。但是对于UIKIT的UIView类,Apple不会允许你在他们的类中添加新的实现。

如果我错了,请纠正我。

答案 3 :(得分:4)

iOS中委托的最常见用途是在模块内建立彼此无关或部分相关的通信。例如,在UINavigationController中向前传递数据非常简单,我们可以使用segue。但是,向后发送数据并不是一件容易的事。在这种情况下,我们可以使用委托向后发送数据。

让我们调用与第一个Controller ClassA相关联的类,以及与第二个Controller ClassB相关联的类。第一个控制器通过前向segue连接到第二个控制器。我们可以通过这个segue将数据从ClassA传递给ClassB。现在,我们需要将一些数据从ClassB传递给ClassA,我们可以使用委托。

发送者类(ClassB)需要在其头文件(.h)中有一个协议,并且还需要在块中引用它作为委托,@ interface ClassB .... @end。这个引用让ClassB知道它有一个委托。任何想要使用此ClassB的类都必须实现所有这些协议所需的方法(如果有的话)。因此,接收器类ClassA将实现该方法,但调用将由发送器类ClassB进行。

这样,接收者类不需要担心发送者类'内部结构,并可以收到所需的信息。

答案 4 :(得分:2)

Delegate只是iOS应用程序对象之间的通信手段。您可以将委托视为连接对象和相互通信的简单方法。换句话说,我们可以说委托允许一个对象在发生任何事件时向其他对象发送消息。

让我们通过现实生活中的例子来理解这一点。

假设有任何办公室有5个柜台。您进入办公室并前往柜台1并提交该柜台的一些详细信息。现在你的细节需要通过计数器3知道的一些过程但计数器1不知道。因此,计数器1将告诉您等待一段时间并将您的详细信息传递给计数器3以完成该过程。在这种情况下,计数器3是处理您的事件的委托,由计数器1引用。在计数器3完成数据处理之后,它将消息发送回计数器1,通知过程已完成,您现在可以继续进行。< / p>

答案 5 :(得分:1)

我理解的是,当一个对象将一个事件的责任传递给另一个对象,从而将责任“委托”给该对象时。

例如,如果您在iOs中有NSButton,则通常将Delegate指定为父视图控制器。这意味着不是在按钮的定义中处理touchUp事件,而是在视图控制器中处理它。

答案 6 :(得分:1)

委托的主要优点是简单地实现“主对象”中的方法(我假设你的意思是执行委托的对象)是委托利用动态绑定。在编译时,不需要知道委托对象的类。例如,您可能有一个委派windowDidMove:方法的类。在本课程中,您可能会看到一些像

这样的代码
if([[self delegate] respondsToSelector:@selector(windowDidMove:)]) {
    [[self delegate] windowDidMove:notification];
}

这里,委托类在运行时检查其委托是否响应给定的方法选择器。这说明了一个强大的概念:委托类除了响应某些方法之外,不需要了解委托的任何内容。这是一种强大的封装形式,它可以说比超类 - 子类关系更灵活,因为委托者和委托是如此松散耦合。简单地在“主对象”(委托对象)中实现方法也是优选的,因为它允许运行时改变方法的实现。这也是有争议的,这个动态运行时使代码本身更危险。

答案 7 :(得分:1)

委托是iOS应用程序的一个重要设计模式。直接或后面的所有应用程序都使用此委托模式。 委托设计模式允许对象代表另一个对象。 如果我们正在使用tableview,那么有“ tableViewDelegate ”和“ tableViewDataSource ”。但这意味着什么

假设您有一个tableview。 现在一些主要关注的问题。 1.此tableview的数据源(将在表视图中显示的数据)是什么? 2.桌面视图等多少行 委托设计模式使用另一个对象作为提供者或这些问题的求解器来解决这些问题。 一个对象将自己标记为表格视图,并通过将自己标记为表格视图的委托来确保表格视图“是我是可以帮助您的人”。谢谢

答案 8 :(得分:1)

委托意味着一个对象将行为传递给另一个对象..

答案 9 :(得分:0)

标记为委托的类负责处理在某些事件发生时发送的回调。例如,在UITextField的情况下,当某些事件发生时会调用一些方法,如编辑开始,编辑结束,字符类型等。这些方法已经在协议中定义。我们必须为那个分配代表,即哪个类将处理这些事件。

答案 10 :(得分:0)

在代表的帮助下,可以实现双向沟通。委托可能用于使对象可重用,提供灵活的方式来发送消息或实现自定义。

答案 11 :(得分:0)

在iOS生态系统中,尤其是UIKit框架,其中包含UIApplicationUITableViewUICollectionViewUITextfield&amp;所以使用delegate&amp;数据源设计模式密集地来回传递数据。

委托设计模式用于将数据从FirstVC(Delegator)传递/传递到SecondVC(Delegate)以完成任务。 在这里,SecondVC(代表)符合协议代表&amp;通过提供body来完成FirstVC(Delegator)给出的任务,实现所有需求,如方法。 此外,FirstVC(Delegator)对象将具有协议委托类型的可选属性,即委托,必须由SecondVC(委托)分配。

现在,FirstVC(Delegator)可以通过从其委托属性传递数据来调用驻留在SecondVC(Delegate)中的方法。

EX:CEO(FirstVC)传递数据,即机密数据&#34;秘书(SecondVC)使用该数据进行进一步的处理。

数据源设计模式是Delegate模式的一部分,用于在将任务分配给SecondVC(Delegate)时将数据从SecondVC(Delegate)传递/传递给FirstVC(Delegator)。 这里,SecondVC(Delegate)符合协议数据源&amp;通过在FirstVC(Delegator)给出任务之后提供与FirstVC(Delegator)对话的主体来实现其所有要求,例如具有返回类型的方法。 此外,FirstVC(Delegator)对象将具有协议dataSource类型的可选属性,即dataSource,必须由SecondVC(Delegate)分配。

现在,FirstVC(Delegator)可以通过从其dataSource属性传递数据,使用驻留在SecondVC(Delegate)中的返回类型调用该方法。

EX:秘书(SecondVC)回复了一个数据,即先生,我已经做了太多工作。请你能将这些数据分配给其他人吗?致首席执行官(FirstVC)。现在,CEO(FirstVC)将分析这些数据以进行进一步的处理。