协议传值

协议传值在数值回调的时候用的比较广泛
一般来说过程是从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];
             }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值