2011-08-27 92 views
27

我刚刚在学习iPhone应用程序开发,但我很难理解代表实际意义何在?任何人都可以用例子告诉我它做了什么以及它有多重要?感谢您的帮助!委托人在xcode ios项目中做了些什么?

+0

请参阅:http://stackoverflow.com/questions/7118598/what-is-the-difference-between-notifications-delegates-and - 协议,并记得在发布之前进行搜索! :) – Luke

+0

关于代表的任何其他问题?答案有道理? – bryanmac

+0

另请参阅[链接](http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and-delegates.html)。 – HDdeveloper

回答

41

从概念上理解这是一个关键的概念,因此在技术细节之前让你的头脑如何思考它是非常重要的。简而言之,委托是回调。

两个主要场景使用委托:

  1. 类或控制要抽象出如何做工作的细节(如检索数据)。
  2. 允许他人将代码挂钩到管道中。

示例: UITableView - 表视图只是一个知道如何呈现单元格列表的控件。它处理渲染,滚动等所有繁重的工作......但是,它不知道如何加载数据。所以你实现一个数据源委托,它具有获取给定行的单元格数据的方法等......这使得你很容易。您只需使用该控件并插入数据的细节即可。 UITableView将为您做所有事情......只回答一些具体问题。一位代表回答这几个具体问题。

一个文本控件 - 你添加一个文本控件到你的视图和瞧!你可以输入它并且很好。但是如果你想在开始输入或输入完成时做些什么呢?那么,文本控件为委托提供了一些方法,使您可以挂钩到文本控件的执行管道中。它允许文本控件为你做所有事情,并允许你在你需要的地方插入代码。很多时候,可以通过插入代码来决定是否允许某些内容。控制器会回电并询问,我应该能够做x?您可以插入代码并影响行为。

如果你正在创建一个控件或类,你可以创建你自己的协议,数据源委托等...所以你的控件可以专注于做广告。例如,假设你想创建一个任务控制。您可以:

首先,创建合同。嘿,如果你要为我的控制提供数据,这些就是我要问你的问题。我会从那里拿...在这种情况下,我会问你任务的数量,我会让你给我一个给定行号的任务。

@protocol XXTaskBoardDelegate <NSObject> 
-(NSInteger*)getTaskCount; 
-(XXTask*)getTaskForRow:(NSInteger*)rowNumber; 
@end 

在控制或类别,给消费者的方式给我们的委托数据源类,将回答这些问题的控制会问。在这一点上,控制是一个纯粹的控制。它对于如何获取数据一无所知。它要求一个实现契约/协议的对象(id)。 ID

@implementation XXTaskBoard 
- (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate 
{ 
    // the control stores the delegate so it can callback and ask you questions. 
} 

然后,对于委托类,在头申报您实现正式协议 并在实施M档您提供的代码。

@interface AppController : NSObject<XXTaskBoardDelegate> 
{ 
    //... 
} 

那么,实现它在执行

@implementation AppController 
- (NSInteger*)getTaskCount 
{ 
    return [model queryTaskCount]; 
} 

- (XXTask*)getTaskForRow:(NSInteger*)rowNumber 
{ 
    return [[model tasks] getItem:(NSInteger*)rowNumber]; 
} 
10

委托是另一个类可以传递消息的对象。实践中,委托类必须符合委托协议。

例如,我们将采取一个表视图控制器的子类。这是您的表格视图的代表。首先定义它是这样一个表视图委托:

MyTableViewController : UITableViewController <UITableViewDelegate> 

这就是说类MyTableViewControllerUITableViewController一个子类,符合UITableViewDelegate协议。

设置[tableView setDelegate:self](或在IB中定义它)然后将self对象传递给tableview以便tableview向其发送消息。

它发送的主要消息是didSelectRowAtIndexPath消息,它告诉你的类,用户已经按下了表格视图单元格。

因此,采用点击事件(表格视图)的对象会传递单元格已被点击到委托对象(在本例中为您的MyTableViewController对象)的消息。

委托协议的存在使您可以确保委托对象具有处理消息的必要方法。委托协议中的方法可以是@optional或强制执行。任何可选的方法都不必定义。在你的MyTableViewController类中,方法didSelectRowAtIndexPath是可选的 - 你不必拥有它。如果表视图没有找到该方法,它就不会调用它。

但是cellForRowAtIndexPath是必要的,如果没有它,你的应用程序将无法编译。

我希望这可以帮助你,并且直接为你服务。如果您需要更多信息,请告诉我。

3

代表只是从某个东西获得回调的方法。您将委托(指向符合协议的对象的指针)传递给某个事物,以及何时为您提供了新数据,或者何时发生某个事件可以在代理上进行方法调用。

例如,当发生事件时,例如将您的应用程序放入后台或应用程序即将终止UIApplication对象,将调用您的应用程序委托让它知道。当一个CLLocationManager有一个新的GPS位置时,会调用你的代理将它传递给新的位置。 UITableViews调用它们的委托让UITableViewCells显示在表中。 iOS中的代表有很多用途。