Class A, Class B
代理的中心意思就是: 代替其他的类去执行一些代码
class A creates something called a protocol. This protocol has a list of methods in it (with no definition).
Class A then has an instance of the protocol as a property.
Class B has to implement the protocol defined in class A.
Lastly, when class A is created, it’s delegate property is set to class B.
代理协议机制在iOS开发中,是非常常用的一种消息传递机制,主要用于子视图向父视图传递数据,代理协议是单向消息传递。
要使用代理协议,需要以下几个步骤:
1. 子视图控制器中需要做如下操作:
1) 在子视图控制器中定义协议,并且定义若干协议方法,注意:只有方法,而没有方法的具体实现。协议的名称通常是子视图控制器的类名+Delegate
2) 在子视图控制器中定义代理属性,代理的属性是weak
3) 子视图控制器中,在需要时直接通过_delegate调用协议方法,就可以执行父视图控制器中的相应方法的实现
2. 父视图控制器中需要做如下操作:
1) 遵从子视图控制器头文件中定义的协议
2) 在推出子视图控制器前,设置自己是子视图控制器的代理,通常在prepareSegue方法中实现
3) 实现子视图控制器中的协议方法,等待子视图控制器的调用
页面传值
GameViewController 上的结果显示到ViewController 上
ViewController 就是代理方
**遵守协议+实现代理方法
GameViewController 是委托方
**定义代理+执行协议方法
委托方:在GameViewController.h中定义
//1.定义协议
//协议名称是委托方名字+delegate
@protocol GameViewControllerDelegate <NSObject>
//2.定义代理
@property (weak,nonatomic)id<GameViewControllerDelegate> delegate;
//委托代理执行方法,如果没有设置代理,不生效,也不报错
[_delegategameViewDidDone:[_timerLabeltext]];
代理方:
在ViewController.m中执行协议方法
//所有vc的内置方法,
//所有sb中的连线在推出新的控制器之前都会调用此方法
//可以通过segue的一个属性获取目标视图控制器
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//获取连线要打开的视图控制器
GameViewController *controller=[segue destinationViewController];
//申请成为游戏试图代理,设置后,游戏室图控制器的协议方法会在当前视图控制器中执行
//self执行代理方法
[controller setDelegate:self];
}
#pragma mark 代理方法
-(void)gameViewDidDone:(NSString *)timeString
{
// NSLog(@"spend:%@",timeString);
NSString *highest=[NSStringstringWithFormat:@"The Highest Score is %@",timeString];
[_HighestScoresetText:highest];
}