记录学习的界面传值方法-代理传值
界面传值的意义
- 我们先创建三个视图
- 在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都可以
- 在界面2的-
// 创建一个点击按钮
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的传值方法多种多样 以后持续学习更新!