ios协议和委托

简介:

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

一 协议

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

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

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

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

二 委托

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

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


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

UITableViewDataSource协议和他的委托方法

@protocol UITableViewDataSource<NSObject>  @required  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;  // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;  @optional  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;  // Editing  // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;  // Moving/reordering  // 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: - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;  // Index  - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#") - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))  // Data manipulation - insert and delete support  // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;  // Data manipulation - reorder / moving support  - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;  @end 

这是一个完整协议定义

@protocol  协议名

声明方法

@end


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

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

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


UITableViewDelegate协议和委托方法

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>  @optional  // Display customization  - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;  // Variable height support  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;  // Section header & footer information. Views are preferred over title should you decide to provide both  - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;   // custom view for footer. will be adjusted to default or specified footer height  // Accessories (disclosures).   - (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0); - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;  // Selection  // Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection. - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); // Called after the user changes the selection. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);  // Editing  // 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. - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath; - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);  // 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. - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;  // 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 - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;  // Moving/reordering  // Allows customization of the target row for a particular row as it is being moved/reordered - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;                 // Indentation  - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; // return 'depth' of row for hierarchies  // Copy/Paste.  All three methods must be implemented by the delegate.  - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);  @end 

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

#import <UIKit/UIKit.h>  @interface BIDViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>  @property (strong, nonatomic) NSDictionary *names; @property (strong, nonatomic) NSArray *keys; @end

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

#pragma mark - #pragma mark Table View Data Source Methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {     return [keys count]; }  - (NSInteger)tableView:(UITableView *)tableView  numberOfRowsInSection:(NSInteger)section {     NSString *key = [keys objectAtIndex:section];     NSArray *nameSection = [names objectForKey:key];     return [nameSection count]; }  - (UITableViewCell *)tableView:(UITableView *)tableView          cellForRowAtIndexPath:(NSIndexPath *)indexPath {     NSUInteger section = [indexPath section];     NSUInteger row = [indexPath row];          NSString *key = [keys objectAtIndex:section];     NSArray *nameSection = [names objectForKey:key];          static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:                              SectionsTableIdentifier];     if (cell == nil) {         cell = [[UITableViewCell alloc]                  initWithStyle:UITableViewCellStyleDefault                  reuseIdentifier:SectionsTableIdentifier];     }          cell.textLabel.text = [nameSection objectAtIndex:row];     return cell; }  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {     NSString *key = [keys objectAtIndex:section];     return key; }  - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {     return keys; }

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

  



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




     本文转自新风作浪 51CTO博客,原文链接:http://blog.51cto.com/duxinfeng/1208715,如需转载请自行联系原作者


相关文章
|
编解码 iOS开发 流计算
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
397 1
|
XML JSON 编解码
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
接上篇《金蝶随手记团队的Protobuf应用实践(原理篇)》,本文将以iOS端的Objective-C代码为例,图文并茂地向您菔救绾卧趇OS工程中快速使用Protobuf,希望对你有帮助。
155 0
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
|
Web App开发 NoSQL Linux
小米被指违反 GPL 协议;iOS 16 公测版发布;Go 1.19 RC1 发布 | 思否周刊
小米被指违反 GPL 协议;iOS 16 公测版发布;Go 1.19 RC1 发布 | 思否周刊
177 0
|
安全 Android开发 iOS开发
iOS隐私安全:用户协议及隐私政策弹框(包含超链接属性、demo支持中英文切换)
iOS隐私安全:用户协议及隐私政策弹框(包含超链接属性、demo支持中英文切换)
1242 1
iOS隐私安全:用户协议及隐私政策弹框(包含超链接属性、demo支持中英文切换)
|
iOS开发
IOS之学习笔记十五(协议和委托的使用)
IOS之学习笔记十五(协议和委托的使用)
110 0
IOS之学习笔记十五(协议和委托的使用)
|
Java iOS开发
IOS之学习笔记十四(协议的定义和实现)
IOS之学习笔记十四(协议的定义和实现)
130 0
|
Java iOS开发
IOS学习笔记十三(使用类别实现非正式协议)
IOS学习笔记十三(使用类别实现非正式协议)
115 0
IOS10安全策略变更,native app需要增加alipays协议白名单
问题:   由于iOS10安全策略的变化,Native APP的WebView默认不支持app_scheme协议(iOS10之前默认支持)。 这将导致在WebView中无法通过alipays://xxxx的方式来唤起支付宝App。
1233 11
|
物联网 iOS开发 Perl
物联网平台iOS开源MQTT协议接入代码测试
使用云端提供的iOS SDK接入平台,也可以使用开源方式接入,测试使用MQTTClient接入物联网平台
695 0
|
iOS开发 前端开发 Swift
iOS中基于协议的路由设计
前段时间对我们自己的App做了结构上的重构,抛弃了之前简单的MVC开发模式。本文将重点分享重构中的Router模块。