protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
当一个A view 里面包含了B view,b view需要修改a view界面,那么这个时候就需要用到委托了。
需要几个步骤
1,首先定一个协议
2,a view实现协议中的方法
3,b view设置一个委托变量
4,把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。
5,事件发生后,用委托变量调用a view中的协议方法
下面分步说明:
1,首先定义一个协议
@protocol PlayerDetailDelegate <NSObject> -(void) updatePlayer:(Player *)player; @end
这是一种正式定义协议的方法,还有一种叫做非正式协议,其实质就是Category,对已有的类的方法进行扩展。
2、a view实现协议中的方法
首先是在头文件中加入实现协议
@interface PlayersViewController : UITableViewController<PlayerDetailDelegate>{ Player *selectedPlayer; } @property(nonatomic,strong) NSMutableArray *players; @end
然后在实现文件中实现协议中的方法
-(void) updatePlayer:(Player *)player{ selectedPlayer = player; NSLog(@"name%@",selectedPlayer.name); }
3,b view中设置一个委托变量
@interface PlayerDetailViewController : UIViewController{ id<PlayerDetailDelegate> _playerDelegate; } @property(nonatomic,strong) IBOutlet UITextView *detailView; @property(nonatomic,strong) Player *player; @property(nonatomic,strong) id<PlayerDetailDelegate> _playerDelegate; - (IBAction)buttonPressed:(id)sender; @end
在适当的地方调用该委托对象
- (IBAction)buttonPressed:(id)sender{ if(_playerDelegate != nil && [_playerDelegate respondsToSelector:@selector(updatePlayer:)]){ self.player.name = self.detailView.text; [_playerDelegate updatePlayer:self.player]; } NSLog(@"执行!"); }
4,把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。
5,事件发生后,用委托变量调用a view中的协议方法