协议和委托

简介:

来源:http://blog.csdn.net/duxinfeng2010/article/details/8120960

在iPhone开发协议和委托是常接触到的东西,到底什么是协议什么是委托,他们什么关系?

一 协议

(1)协议相当于没有与类相关联的接口,他申明一组方法,列出他的参数和返回值,共享给其他类使用,然后不进行实现,让用它的类来实现这些方法

(2)在任何一个类中,只有声明了协议,都可以实现协议里的方法。

(3)协议不是一个类,更没有父类了。

(3)协议里面的方法经常都是一些委托方法,

二 委托

委托,故名思议就是托别人办事。打个比方:

张三迫切需要一分工作,但是不知道去哪找。于是他就拜托(委托)李四给帮找一份合适工 作,但是托人办事得给被人好处啊,于是张三给李四塞了一个红包(协议),于是李四通过自己关系在某公司找了一份文秘的工作(实现协议里面委托方法),于然 后他把文秘这份工作给了张三,张三就找到工作了;


三 我们来看一个比较常用的表格单元实现委托和协议

UITableViewDataSource协议和他的委托方法

[cpp]  view plain copy
  1. @protocol UITableViewDataSource<NSObject>  
  2.   
  3. @required  
  4.   
  5. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;  
  6.   
  7. // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:  
  8. // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)  
  9.   
  10. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;  
  11.   
  12. @optional  
  13.   
  14. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented  
  15.   
  16. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different  
  17. - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;  
  18.   
  19. // Editing  
  20.   
  21. // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.  
  22. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;  
  23.   
  24. // Moving/reordering  
  25.   
  26. // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:  
  27. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;  
  28.   
  29. // Index  
  30.   
  31. - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")  
  32. - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))  
  33.   
  34. // Data manipulation - insert and delete support  
  35.   
  36. // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change  
  37. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;  
  38.   
  39. // Data manipulation - reorder / moving support  
  40.   
  41. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;  
  42.   
  43. @end  


这是一个完整协议定义

@protocol  协议名

声明方法

@end


但是我们还看到两个特殊关键字 @required  和 @optional

@required 表示我们用到这个协议的时候必须实现这个协议的方法

@optional 表示我们可选择性实现这些方法,看那个需要我们就去实现,不需要的就不实现


UITableViewDelegate协议和委托方法

[cpp]  view plain copy
  1. @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>  
  2.   
  3. @optional  
  4.   
  5. // Display customization  
  6.   
  7. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;  
  8.   
  9. // Variable height support  
  10.   
  11. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;  
  12. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;  
  13. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;  
  14.   
  15. // Section header & footer information. Views are preferred over title should you decide to provide both  
  16.   
  17. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height  
  18. - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;   // custom view for footer. will be adjusted to default or specified footer height  
  19.   
  20. // Accessories (disclosures).   
  21.   
  22. - (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);  
  23. - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;  
  24.   
  25. // Selection  
  26.   
  27. // Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.  
  28. - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;  
  29. - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);  
  30. // Called after the user changes the selection.  
  31. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;  
  32. - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);  
  33.   
  34. // Editing  
  35.   
  36. // Allows customization of the editingStyle for a particular cell located at 'indexPath'. If not implemented, all editable cells will have UITableViewCellEditingStyleDelete set for them when the table has editing property set to YES.  
  37. - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;  
  38. - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);  
  39.   
  40. // Controls whether the background is indented while editing.  If not implemented, the default is YES.  This is unrelated to the indentation level below.  This method only applies to grouped style table views.  
  41. - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;  
  42.   
  43. // The willBegin/didEnd methods are called whenever the 'editing' property is automatically changed by the table (allowing insert/delete/move). This is done by a swipe activating a single row  
  44. - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;  
  45. - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;  
  46.   
  47. // Moving/reordering  
  48.   
  49. // Allows customization of the target row for a particular row as it is being moved/reordered  
  50. - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;                 
  51.   
  52. // Indentation  
  53.   
  54. - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; // return 'depth' of row for hierarchies  
  55.   
  56. // Copy/Paste.  All three methods must be implemented by the delegate.  
  57.   
  58. - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);  
  59. - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);  
  60. - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);  
  61.   
  62. @end  


在用的时候,我们现在声明协议

[cpp]  view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface BIDViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>  
  4.   
  5. @property (strong, nonatomic) NSDictionary *names;  
  6. @property (strong, nonatomic) NSArray *keys;  
  7. @end  

 

实现UITableViewDataSource  UITableViewDelegate协议里面的委托方法

[cpp]  view plain copy
  1. #pragma mark -  
  2. #pragma mark Table View Data Source Methods  
  3. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
  4.     return [keys count];  
  5. }  
  6.   
  7. - (NSInteger)tableView:(UITableView *)tableView  
  8.  numberOfRowsInSection:(NSInteger)section {  
  9.     NSString *key = [keys objectAtIndex:section];  
  10.     NSArray *nameSection = [names objectForKey:key];  
  11.     return [nameSection count];  
  12. }  
  13.   
  14. - (UITableViewCell *)tableView:(UITableView *)tableView  
  15.          cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  16.     NSUInteger section = [indexPath section];  
  17.     NSUInteger row = [indexPath row];  
  18.       
  19.     NSString *key = [keys objectAtIndex:section];  
  20.     NSArray *nameSection = [names objectForKey:key];  
  21.       
  22.     static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";  
  23.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:  
  24.                              SectionsTableIdentifier];  
  25.     if (cell == nil) {  
  26.         cell = [[UITableViewCell alloc]  
  27.                  initWithStyle:UITableViewCellStyleDefault  
  28.                  reuseIdentifier:SectionsTableIdentifier];  
  29.     }  
  30.       
  31.     cell.textLabel.text = [nameSection objectAtIndex:row];  
  32.     return cell;  
  33. }  
  34.   
  35. - (NSString *)tableView:(UITableView *)tableView  
  36. titleForHeaderInSection:(NSInteger)section {  
  37.     NSString *key = [keys objectAtIndex:section];  
  38.     return key;  
  39. }  
  40.   
  41. - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {  
  42.     return keys;  
  43. }  

 

这就就是实现一些里面的委托方法过程运行改程序运行结果

  



该程序源码http://download.csdn.net/detail/duxinfeng2010/4695666 



本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3471071.html,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
C#
C#中的委托(一)
C#中的委托(一)
49 1
|
C#
多播委托
多播委托
106 0
|
监控 C#
艾伟_转载:把委托说透(1):开始委托之旅 委托与接口
委托,本是一个非常基础的.NET概念,但前一阵子在园子里却引起轩然大波。先是Michael Tao的随笔让人们将委托的写法与茴香豆联系到了一起,接着老赵又用一系列文章分析委托写法的演变,并告诫“嘲笑孔乙己的朋友们,你们在一味鄙视“茴”的四种写法的同时,说不定也失去了一个了解中国传统文化的机会呢!”。
1012 0
|
.NET
艾伟_转载:把委托说透(2):深入理解委托
在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口。本文将重点剖析委托的实质。 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastDelegate。
1117 0
|
程序员
【转发】什么时候该用委托,为什么要用委托,委托有什么好处
好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处.... 看完下面的文章你将茅塞顿开..(看不懂的直接TDDTDS) 概念虽然我不喜欢讲太多 我们直接先来YY 个场景:我很喜欢打游戏,但运气不好每次打游戏都会被主管看到,朱老板不喜欢他的员工在上班的时 间打游戏,所以朱老板就跟主管说:以后员工在打游戏,你就扣他20块钱.
993 0