属性传值和协议传值

多界面传值

在切换不同的ViewController视图控制器时,通过某些方法将A视图控制器中想要的某些数据传输到B视图控制器中

一、 属性传值

属性传值最大的特点就是正向传值,即A页面传值给B页面

第一步
需要传值给B就在B中定义一个属性(之所以在B.h中定义,是因为在B.h中声明的属性,在A的文件里新创建B视图控制器后也可以访问)

1、因为要将A中的值传给B,所以在B中定义个字符串类型的属性接收A传来的值。

@property (nonatomic,copy) NSString *sendText;

利用这个NSString,可以将拿到的值赋给B中的Label、textfield等

第二步
2、在A中给B的属性赋值并跳转

-(void)ASendMessageToB {

    BViewController* bViewController = [[BViewController alloc] init];
    
    //获取B就可以拿到B中的属性,并在A控制器里赋值了
    bViewController.sendText = self.label.text;		//这个就是需要传给B控制器的值,根据需要自己赋值
    
    //跳转控制器,用到了presentViewController方法进行页面间的跳转
    [self presentViewController:bViewController animated:YES completion:nil];

注意:需要在A中定义一个B视图控制器的对象,这样才能获取它的属性,从而在A视图控制器中改变B。

第三步:
B中的sendText此时已经接收到A传来的值,可以进行使用了。

二、 协议传值

协议传值最大的特点就是反向传值,即B页面传值给A页面

  • 在B页面:
    1、定义一个代理协议
    2、定义协议函数
    3、定义属性,属性需要定义一个协议(代理)对象,注意为id类型。

代理对象会执行协议函数,从而改变代理对象本身属性的目的。所以想要A页面实现什么,就定义什么样的协议函数。B无法直接改变A页面,因此通过代理来改变A页面。

  • 在A页面:
    1、继承B中定义的代理协议。
    2、实现B中定义的协议函数。
    3、将自己赋值给B的代理。
  • 最后一步:

在B中代理对象调用事件函数,从而改变代理的属性,从而改变A。

具体代码实现如下:

在B视图中:
第一步:在B中定义代理协议
第二步:定义协议函数(想要代理实现什么就定义什么)

// 定义一个代理协议,B视图控制器的协议
@protocol VCSecondDelegate <NSObject>

//定义一个协议函数,改变A视图的背景颜色
- (void) changeColor:(UIColor*) color;

@end

第三步:在B中定义代理对象,注意代理对象为id类型,assign 为赋值型。

//定义一个代理对象
//这个代理对象会执行协议函数
//通过代理对象来实现协议函数,达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic) id<VCSecondDelegate> delegate;

在A视图中:

第一步:继承代理协议

@interface VCfirst : UIViewController<VCSecondDelegate>

第二步:实现代理协议

//通过代理的协议来改变背景颜色
- (void) changeColor:(UIColor *)color {
    self.view.backgroundColor = color;
}

第三步:将当前视图赋值给B的代理

//推出视图控制器B
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    VCsecond* vcSecond = [[VCsecond alloc] init];
    vcSecond.title = @"视图B";
    
    //将当前的控制器作为代理对象赋值
    vcSecond.delegate = self;
    
    //推出视图控制器B
    [self.navigationController pushViewController:vcSecond animated:YES];
}

Last step
在B中:代理对象调用协议函数;

    //代理对象调用事件函数
    [_delegate changeColor:[UIColor purpleColor]];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值