在iOS开发中代理是非常常见和普遍的,代理是一种通用的设计模式,iOS中对代理支持的很好,由代理对象、委托者、协议三部分组成。
- 协议:用来指定代理双方可以做什么,必须做什么。
- 代理:根据指定的协议,完成委托方需要实现的功能。
- 委托:根据指定的协议,指定代理去完成什么功能。
代理的具体实现:
首先要在委托方.h文件中定义声明:
//MPMusicPlayingViewController.h
#import <UIKit/UIKit.h>
@protocol MPMusicPlayingViewDelegate;//代理名称一般以委托方类名+delegate
@interface MPMusicPlayingView : UIView
//遵循协议的一个代理变量定义
@property (nonatomic,weak)id<MPMusicPlayingViewDelegate>delegate;
@end
//定义代理协议
@protocol MPMusicPlayingViewDelegate <NSObject>
- (void)MusicVcWantDoSomeThing:(NSString */*要传递的参数,此处以字符串为例*/)string;
//也可以不传参数只实现委托方法
@end
在委托方.m文件中:
//MPMusicPlayingViewController.h
- (void)viewDidLoad{
[super viewDidLoad];
NSString *thank = @"tahankYou";
[self iWantDoSomeThing:thank];
}
- (void)iWantDoSomeThing:(NSString *)string{
if (self.delefate respondsToSelector:@selector(MusicVcWantDoSomeThing:)) {
//要在实现代理的.m中实现代理方法才会掉用
[self.delegate MusicVcWantDoSomeThing:string];
}
}
在代理方的.m文件中
//MPMusicRootViewController
#import "MPMusicPlayingViewController.h"//先包含委托方的头文件
@interface MPMusicRootViewController ()< MPMusicPlayingViewDelegate >//这里要注意!
- (void)viewDidLoad {
[super viewDidLoad];
MPMusicPlayingViewController *PlayingVC = [[MPMusicPlayingViewController alloc] init];
PlayingVC.delegate = self;//设置代理实例
}
//当MPMusicPlayingViewController中掉用iWantDoSomeThing:方法是此代理方法实现
- (void)MusicVcWantDoSomeThing:(NSString */*要传递的参数,此处以字符串为例*/)string{
NSLog(@"传过来的值为:%@",string);
//如果需要用可以定义个全局变量把string的值拿去用。
}
大多数人想要改造这个世界,但却罕有人想改造自己。