标签:
在iPhone开发协议和委托是常接触到的东西,到底什么是协议什么是委托,他们什么关系?
一 协议
(1)协议相当于没有与类相关联的接口,他申明一组方法,列出他的参数和返回值,共享给其他类使用,然后不进行实现,让用它的类来实现这些方法
(2)在任何一个类中,只有声明了协议,都可以实现协议里的方法。
(3)协议不是一个类,更没有父类了。
(3)协议里面的方法经常都是一些委托方法,
二 委托
委托,故名思议就是托别人办事。打个比方:
张三迫切需要一分工作,但是不知道去哪找。于是他就拜托(委托)李四给帮找一份合适工作,但是托人办事得给被人好处啊,于是张三给李四塞了一个红包(协议),于是李四通过自己关系在某公司找了一份文秘的工作(实现协议里面委托方法),于然后他把文秘这份工作给了张三,张三就找到工作了;
三 我们来看一个比较常用的表格单元实现委托和协议
UITableViewDataSource协议和他的委托方法
- @protocol UITableViewDataSource<NSObject>
-
- @required
-
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
-
-
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
-
- @optional
-
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
-
- - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
-
-
- - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
- - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
-
-
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
-
- @end
这是一个完整协议定义
@protocol 协议名
声明方法
@end
但是我们还看到两个特殊关键字 @required 和 @optional
@required 表示我们用到这个协议的时候必须实现这个协议的方法
@optional 表示我们可选择性实现这些方法,看那个需要我们就去实现,不需要的就不实现
UITableViewDelegate协议和委托方法
- @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
-
- @optional
-
-
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
-
-
- - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
-
-
- - (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;
-
-
- - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
-
-
- - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
- - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
-
- - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;
-
- - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
- - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;
-
-
- - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;
-
-
- - (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
ios协议和委托
标签:
原文地址:http://www.cnblogs.com/lmg4819/p/4806473.html