一、基本概念
在介绍多界面传值之前先从下面的情景导入一下。
我们先创建三个视图控制器
接着我们在SceneDelegate.m文件中创建导航控制器和分栏控制器并将视图控制器一和视图控制器三分别添加到导航控制器一和导航控制器二再将导航控制器一和二添加到分栏控制器中
FirstViewController* fVC = [[FirstViewController alloc] init];
fVC.title = @"视图一";
fVC.view.backgroundColor = [UIColor grayColor];
ThirdViewController* tVC = [[ThirdViewController alloc] init];
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:fVC];
tVC.title = @"视图三";
tVC.view.backgroundColor = [UIColor greenColor];
UINavigationController* nav2 = [[UINavigationController alloc] initWithRootViewController:tVC];
NSArray* array = [NSArray arrayWithObjects:nav, nav2, nil];
UITabBarController* tabVC = [[UITabBarController alloc] init];
tabVC.viewControllers = array;
self.window.rootViewController = tabVC;
接着我们创建一个函数使得我们点击视图一跳转到视图二
//点击屏幕空白处推出视图控制器二
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
SecondViewController* sVC = [[SecondViewController alloc] init];
sVC.view.backgroundColor = [UIColor orangeColor];
//推出视图控制器二
[self.navigationController pushViewController:sVC animated:YES];
}
可以看到我们可以通过视图一来改变视图二的颜色
那么我们该如何通过视图二来改变前面的视图一堆颜色呢?
这时候就需要多界面传值了,所谓的多界面传值就是实现多个界面之间值的传递,下面是几种实现方法:
委托模式(Delegate Pattern):委托模式是一种常见的iOS开发模式,用于在两个对象之间传递信息。在这种模式下,一个对象(委托方)将其某些行为委托给另一个对象(代理方),并在需要时通知代理方。在iOS开发中,可以使用委托模式将数据从一个视图控制器传递到另一个视图控制器。
通知中心(NotificationCenter):通知中心是一种iOS框架,用于在应用程序内部或应用程序之间传递信息。使用通知中心,可以将数据发送给所有对该通知感兴趣的对象,而不用关心是哪个对象接收数据。在iOS开发中,可以使用通知中心将数据从一个视图控制器传递到另一个视图控制器。
单例模式(Singleton Pattern):单例模式是一种iOS开发模式,用于创建一个全局唯一的对象。在iOS开发中,可以使用单例模式来存储应用程序中的全局数据,从而可以在多个视图控制器之间共享数据。
属性传值:在iOS开发中,可以使用属性来传递数据。在一个视图控制器中设置一个属性,并在另一个视图控制器中访问该属性,从而可以传递数据。
Segue传值:在iOS开发中,可以使用Segue来传递数据。在一个视图控制器中设置一个属性,在另一个视图控制器中使用Segue传递数据。在目标视图控制器中,可以使用prepareForSegue方法来获取传递的数据。
实现多界面传值常用的方法是通过委托来实现,下面就是具体的实现步骤。
二、实现方法
我们先在SecondViewController.h文件中声明一个协议和实现方法
//定义代理协议,视图控制器二的协议
@protocol VCSecondDelegate<NSObject>
//定义一个协议函数来改变背景颜色
- (void)changeColor: (UIColor*)color;
@end
接着我们声明一个代理对象
@property (nonatomic, assign)NSInteger tag;
//定义一个代理对象
//代理对象会执行协议函数
//通过代理对象实现协议函数来达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic)id<VCSecondDelegate>delegate;
然后我们在FirstViewController.h中声明该方法
#import <UIKit/UIKit.h>
#import "SecondViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface FirstViewController : UIViewController<VCSecondDelegate>
- (void)changeColor: (UIColor*) color;
@end
NS_ASSUME_NONNULL_END
并在FirstViewController.m中实现该方法
- (void)changeColor:(UIColor *)color {
self.view.backgroundColor = color;
}
需要注意的是我们还需要将当前的视图控制器也就是视图控制器一作为代理对象赋值
//点击屏幕空白处推出视图控制器二
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
SecondViewController* sVC = [[SecondViewController alloc] init];
//将当前的控制器作为代理对象赋值
sVC.delegate = self;
sVC.view.backgroundColor = [UIColor orangeColor];
//推出视图控制器二
[self.navigationController pushViewController:sVC animated:YES];
}
最后我们在SecondViewController.m创建一个按钮来触发代理对象调用事件函数来实现改变颜色的操作
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIBarButtonItem* changeBtn = [[UIBarButtonItem alloc] initWithTitle:@"改变颜色" style:UIBarButtonItemStyleDone target:self action:@selector(pressChange)];
self.navigationItem.rightBarButtonItem = changeBtn;
}
//点击按钮时,触发代理的事件
- (void)pressChange {
//代理对象调用事件函数
[_delegate changeColor:[UIColor redColor]];
}
当我们点击按钮并返回视图一时发现其颜色发生了改变。
需要注意的就是我们在哪个视图要改变别的视图的背景颜色,就在当前视图文件中声明协议和实现方法然后在被改变视图的文件中完成该实现方法。
总结
以上就是本篇文章的全部内容。