我自己用代理模式最多的地方是用来方向传值。如果是顺传的话用属性传值就可以了。
- 举个例子吧
当我们做登录的时候,需要把值传递上一个页面做处理的情况。
需要在委托方的.h文件中这样写
#import <Foundation/Foundation.h>
//这里是自定义代理协议
@protocol LoginProtocol <NSObject>
//这里是代理方法关键字@optional代表可选实现的方法
@optional
//这里就是自定义的代理方法了(可以带参数,也可以不带参数)
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password;
@end
然后需要在委托方的.m文件中这样写
#import <UIKit/UIKit.h>
#import "LoginProtocol.h"
/**
* 当前类是委托类。用户登录后,让代理对象去实现登录的具体细节,委托类不需要知道其中实现的具体细节。
*/
@interface LoginViewController : UIViewController
// 通过属性来设置代理对象
@property (nonatomic, weak) id<LoginProtocol> delegate;
@end
实现部分:
@implementation LoginViewController
- (void)loginButtonClick:(UIButton *)button {
// 判断代理对象是否实现这个方法,没有实现会导致崩溃
if ([self.delegate respondsToSelector:@selector(userLoginWithUsername:password:)]) {
// 调用代理对象的登录方法,代理对象去实现登录方法
[self.delegate userLoginWithUsername:self.username.text password:self.password.text];
}
}
然后在代理方的.m文件中这样写
// 遵守登录协议
@interface ViewController () <LoginProtocol>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
LoginViewController *loginVC = [[LoginViewController alloc] init];
loginVC.delegate = self;
[self.navigationController pushViewController:loginVC animated:YES];
}
/**
* 代理方实现具体登录细节
*/
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password {
NSLog(@"username : %@, password : %@", username, password);
}
网友评论