协议传值在数值回调的时候用的比较广泛
一般来说过程是从A -> B -> A的一个传递方式。
在a中,既然要接受别人的传值,那么就要在a中声明该协议,在所声明的协议方法中得到想要的数值。
在b中,既然要给别人传值,那么就要声明代理属性
(可以传具体的数值或者将某些数值打包为类整体传递过去)
例如:
将一个Account类从从SecondViewController传到FirstViewController
//FirstViewController.h文件
#import <Foundation/Foundation.h>
@class Account;
NS_ASSUME_NONNULL_BEGIN
//设置代理
@protocol addDelegate <NSObject>
//方法,传输account
-(void)pass:(Account *) account;
@end
@interface MainViewController : UIViewController
<
addDelegate
>
@property (nonatomic, strong)NSMutableArray *nameArray;
@property (nonatomic, strong)NSMutableArray *classArray;
@property (nonatomic, strong)NSMutableArray *scoreArray;
@end
//FirstViewController.m
#import "MainViewController.h"
#import "AddViewController.h"
#import "Account.h"
//点击事件函数
- (void)add {
AddViewController *addController = [[AddViewController alloc] init];
//呈现全屏
addController.modalPresentationStyle = UIModalPresentationFullScreen;
//把main里面的数组给到add函数中的数组
addController.nameArr = _nameArray;
addController.classArr = _classArray;
addController.scoreArr = _scoreArray;
//设置代理
addController.addDelegate = self;
[self presentViewController:addController animated:NO completion:nil];
//实现协议方法
- (void)pass:(Account *)account {
[_nameArray addObject:account.nameString];
[_scoreArray addObject:account.scoreString];
[_classArray addObject:account.classString];
[_tableView reloadData];
}
}
//SecondViewController.h
#import <UIKit/UIKit.h>
#import "Account.h"
NS_ASSUME_NONNULL_BEGIN
@class Account;
//代理
@protocol addDelegate <NSObject>
-(void) pass: (Account *) account;
@end
@interface AddViewController : UIViewController
@property (nonatomic, strong)NSMutableArray *nameArr;
@property (nonatomic, strong)NSMutableArray *scoreArr;
@property (nonatomic, strong)NSMutableArray *classArr;
@property id <addDelegate> addDelegate;
@end
//SecondViewController.m
//在返回上一个界面的时候的事件函数
- (void)add{
[self dismissViewControllerAnimated:NO completion:nil];
//判断pass:方法是否实现,若实现则执行传值操作
if ([_addDelegate respondsToSelector:@selector(pass:)]) {
Account *account = [[Account alloc] init];
account.nameString = _nameTextField.text;
account.classString = _classTextField.text;
account.scoreString = _scoreTextField.text;
//通过委托协议传值
[_addDelegate pass:account];
}