委托在xcode ios项目中究竟做了些什么?
我刚刚学习iPhone应用程序的开发,但是我很难理解代表的实际意义。 任何人都可以用例子告诉我它做了什么,它有多重要? 感谢您的帮助!
从概念上理解是一个关键的概念,所以在技术细节之前让你头脑清醒是很重要的。 简而言之,委托是callback。
两个主要的scheme使用代表:
- 一个类或控件想要抽象出如何工作的细节(如检索数据)。
- 允许他人将代码挂钩到pipe道中。
示例:UITableView – 表视图只是一个知道如何呈现单元格列表的控件。 它处理渲染,滚动等所有繁重的工作。但是,它不知道如何加载数据。 所以你实现一个数据源委托,它有方法获取给定的行的单元格数据等…这让你很容易。 您只需使用控件并插入数据的细节即可。 UITableView将为您做所有事情…只是回答一些具体的问题。 一位代表回答这几个具体问题。
一个文本控件 – 你添加一个文本控件到你的视图,瞧! 你可以input它并且很好。 但是如果你想在开始打字或打字时做点什么呢? 那么,文本控件提供了一个委托与方法,让你挂钩到文本控制的执行pipe道。 它允许文本控件为您做所有事情,并允许您在需要的地方插入代码。 很多时候,可以插入代码来决定是否允许某些事情。 控制器会回复并询问,我应该能够做x? 您可以插入代码并影响行为。
如果你正在创build一个控件或类,你可以创build自己的协议,数据源委托等…所以你的控制可以专注于做什么广告。 例如,假设你想创build一个任务控制。 你可以:
首先,创build一个合同。 嘿,如果你要为我的控制提供数据,这些是我要问你的问题。 我会从那里拿…在这种情况下,我会问你任务的数量,我会让你给我一个任务给行号。
@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]; }
委托是另一个类可以传递消息的对象。 实践中,委托类必须符合委托协议。
例如,我们将采取一个表视图控制器的子类。 这是您的表格视图的代表。 首先你通过这样来定义它是一个表视图委托:
MyTableViewController : UITableViewController <UITableViewDelegate>
这就是说类MyTableViewController
是UITableViewController
一个子类,并且是UITableViewDelegate
协议的CONFORMS。
设置[tableView setDelegate:self]
(或者在IB中定义它),然后将self
对象传递给tableview,以便tableview向它发送消息。
它发送的主要消息是didSelectRowAtIndexPath
消息,告诉你的类,用户已经按下了表格视图单元格。
因此,接受点击事件的对象(表视图)将单元格已被单击的消息传递给委托对象(在本例中为MyTableViewController
对象)。
委托协议的存在,使你可以确保委托对象有处理你的消息的必要的方法。 委托协议中的方法可以是@optional
或强制的。 任何可选的方法都不需要定义。 在MyTableViewController
类中,方法didSelectRowAtIndexPath
是可选的 – 你不必拥有它。 如果表视图没有find方法,它就不会调用它。
然而, cellForRowAtIndexPath
是必要的,没有它你的应用程序将不会编译。
我希望这对你有帮助,而且是直接的。 如果您需要更多信息,请告诉我。
代表只是从某个东西获得callback的方法。 您将一个委托(指向符合协议的对象的指针)传递给某个事物,以及何时为您提供了新数据,或者当某个事件发生时,某个事件会在委托上进行方法调用。
例如,当事件发生时,比如你的应用程序被放到后台,或者应用程序即将终止,UIApplication对象将调用你的应用程序委托让它知道。 当一个CLLocationManager有一个新的GPS位置时,会调用你的委托来传递它的新位置。 UITableViews调用它们的委托来让UITableViewCells显示在表中。 在iOS中代理有很多用途。