iOS界面传值-代理传值

记录学习的界面传值方法-代理传值

界面传值的意义

  • 我们先创建三个视图

在这里插入图片描述

  • 在SceneDelegate.m文件里初始化 Vc1 和Vc3
    • Vc1的初始化
Vc1* vc1 = [[Vc1 alloc] init];
    vc1.title = @" 视图1";
    vc1.view.backgroundColor  = [UIColor whiteColor];
    
    • Vc1的导航控制器
 // vc1 作为导航控制器的根视图
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc1];
  • VC3 同理
Vc3* vc3 = [[Vc3 alloc] init];
    vc3. title = @" 试图3";
    vc3.view.backgroundColor = [UIColor greenColor];
    
    // 给视图三加上导航控制器
    UINavigationController *nav2 = [[UINavigationController alloc]initWithRootViewController:vc3];
  • 使用数组存储这两个视图,然后传值给Tabbar
 NSArray* arrayVc = [NSArray arrayWithObjects:nav, nav2, nil];
    
    UITabBarController*  tabVc = [[UITabBarController alloc] init];
    tabVc.viewControllers = arrayVc;
    
    self.window.rootViewController = tabVc;

在这里插入图片描述

  • 在Vc1视图里创建Vc2 使得点击空白处即可进入Vc2
  • touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    点击空白处即实现对应的函数
    • 推出视图控制器2
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 视图控制器1可以拿到视图控制器2 的对象,性质随我们改变
    Vc2 *vc2 = [[Vc2 alloc] init];
    
    [self.navigationController pushViewController:vc2 animated:YES];

// 设置V2的背景颜色以便于区分
    vc2.view.backgroundColor = [UIColor orangeColor];
}

  • 点击了视图1 的空白处即跳转到了试图2
    在这里插入图片描述

界面传值

我们可以从界面一点击空白处到界面二,那么要从界面二改变界面一的颜色就需要用到所说的界面传值
这里只会代理传值

实现代理传值

  • 如何在视图二的控制器里改变视图控制器一的颜色
    • 思路入下
      1.在第二级控制器.h文件中,设置正式协议
      2.在第二级控制器.h文件中写属性和协议中的方法
      3.在第二级控制器.m文件中,利用代理属性,去调用协议里面的方法(同时把参数传出来)
      4.在第一级控制器中遵守协议
      5.在第一级控制器中设置代理
      6.在第一级控制器中重写代理方法
  • 在视图2设置协议和协议改变颜色的方法,这里的视图2就是上面的二级控制器
//  ding定义视图控制器2的协议-- 改变视图一的颜色
// 正式协议的定义
@protocol Vc2Delegate <NSObject>

// 协议函数
// 改变视图 1 的 颜色背景
// 协议部分不提供协议函数的实现
-(void)changeColor: (UIColor*) color;

@end

@interface Vc2 : UIViewController
 // 定义代理对象 
//代理对象并执行协议函数
// 通过代理对象实现
@property (nonatomic, assign) id<Vc2Delegate> delegate;
@end

注意:代理对象必须实现协议函数—不实现代理协议函数程序崩溃协议不提供方法的实现,体现了定义和实现分离的哲学原理

  • 在视图二里实现协议的方法
    • 在界面2的-viewDidLoad创建一个点击的按钮或者label都可以
//  创建一个点击按钮
    UIBarButtonItem* btnChange = [[UIBarButtonItem alloc]  initWithTitle:@"Change" style:UIBarButtonItemStylePlain target:self 
    action:@selector(pressR)];
    
    // 右按钮赋值
    self.navigationItem.rightBarButtonItem = btnChange;

    • 点击按钮触发代理事件-设置把界面一改为redColor
-(void) pressR {
    //点击按钮🔘触发代理事件
    [_delegate changeColor:[UIColor redColor]];
    
}
  • 在一级控制器(视图1.h)的遵守协议并再次声明协议的传值方法
@interface Vc1 : UIViewController<Vc2Delegate>
-(void) changeColor:(UIColor *)color;
@end
  • 最后在一级控制器(视图1)的.m文件重写协议方法
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
  • ⚠️重要的一环
    ** 在视图1的- ouchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {方法添加如下一行代码

  • vc2.delegate = self;

  • 此行代码的意义: 将我们创建的视图二(二级控制器)作为代理对象并赋值,否则界面一的颜色无法改变

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 视图控制器1可以拿到视图控制器2 的对象,性质随我们改变
    Vc2 *vc2 = [[Vc2 alloc] init];
    vc2.title = @"视图2";
    // 将当前的控制器作为代理对象,赋值之后的界面1 颜色才能改变
    vc2.delegate = self;
    
    [self.navigationController pushViewController:vc2 animated:YES];

    vc2.view.backgroundColor = [UIColor orangeColor];
}

此时我们点击Change 即改变了视图1的界面颜色

在这里插入图片描述

在这里插入图片描述

iOS的传值方法多种多样 以后持续学习更新!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值