传值在开发中我们会经常用到,传值又分为正向传值和反向传值。从界面一跳转到界面二且将值从界面一传递给界面二使用,称之为正向传值;从界面一跳转到界面二,从界面二返回界面一时将值传递给界面一使用,称之为反向传值。在此,小编给大家详细讲解几种正向传值和反向传值常用到的方法。
一、正向传值
常用到的正向传值是属性传值,方便简单。举例代码如下:
1、声明属性
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//在界面二的.h文件中声明一个字符串的属性itemTitle
@property (nonatomic, copy) NSString * itemTitle;
@end
2、属性赋值
//如在此button点击事件方法中跳转界面
- (void)btnWasClicked:(UIButton *)ban {
SecondViewController * secVC = [[SecondViewController alloc] init];
//在界面一中跳转前对界面二的属性进行赋值
secVC.itemTitle = @"我是要传的值";
//跳转到界面二
[self presentViewController:secVC animated:YES completion:nil];
}
3、属性使用
- (void)viewDidLoad {
[super viewDidLoad];
//在界面二的.m文件中可以对该属性的值进行需要的操作
NSLog(@"itemTitle = %@",self.itemTitle); //打印结果:itemTitle = 我是要传的值
}
二、反向传值
常用到的反向传值有block、代理和通知。
1、首先来给大家说一下block的传值使用,举例代码如下:
(1)在界面二.h中定义block并声明属性
#import <UIKit/UIKit.h>
//1、在界面二中定义一个名为MyBlock的block,设置两个NSString类型的参数可以传递两个字符串的值
typedef void(^MyBlock)(NSString *, NSString *);
@interface SecondViewController : UIViewController
//2、将定义的block定义成属性
@property(nonatomic, copy) MyBlock myBlock;
@end
(2)在界面二.m中赋值
//例如在返回按钮事件中实现赋值
- (void)btnWasClicked:(UIButton *)btn{
//3、给block属性赋值 传递参数
self.myBlock(@"传值一", @"传值二");
//返回上一个界面
[self dismissViewControllerAnimated:YES completion:nil];
}
(3)在界面一中回调使用
//如在此button点击事件方法中跳转界面
-(void)btnWasClicked:(UIButton *)btn{
SecondViewController * secVC = [[SecondViewController alloc] init];
//4、回调得到参数
secVC.myBlock = ^(NSString * str1, NSString * str2) {
//此处的str1和str2为回调的参数,在此可以对此参数进行相应的操作使用
NSLog(@"str1 = %@", str1); //打印结果:str1 = 传值一
NSLog(@"str2 = %@", str2); //打印结果:str2 = 传值二
};
//跳转到下一个界面
[self presentViewController:secVC animated:YES completion:nil];
}
2、接来下给大家简单介绍一下代理传值的用法,举例代码如下:
(1)在界面二.h中制订协议及协议方法并声明属性
#import <UIKit/UIKit.h>
//1、制定协议及协议方法
@protocol SecondDelegate <NSObject>
//协议方法 此处传递一个NSString类型的值
//@optional为非必须实现方法,如果没有加@optional,默认为必须实现方法
- (void)sendMessage:(NSString *)text;
@end
@interface SecondViewController : UIViewController
//声明属性,使用weak修饰
@property(nonatomic, weak) id<SecondDelegate> delegate;
@end
(2)在界面二.m中对代理协议方法赋值
//例如在返回按钮事件中实现赋值
- (void)btnWasClicked:(UIButton *)btn{
//2、赋值前验证代理方法是否存在,存在则赋值
if ([self.delegate respondsToSelector:@selector(sendMessage:)]) {
//在此赋值
[self.delegate sendMessage:@"我是传递的值"];
}
//返回上一个界面
[self dismissViewControllerAnimated:YES completion:nil];
}
(3)在界面一中遵从协议并实现代理方法获取传值
#import "FirstViewController.h"
#import "SecondViewController.h"
//3、遵从SecondDelegate代理协议
@interface FirstViewController () <SecondDelegate>
@end
@implementation FirstViewController
//这里省略了创建button及一些其他控件的代码
//如在此button点击事件方法中跳转界面
- (void)btnWasClicked:(UIButton *)btn{
SecondViewController * secVC = [[SecondViewController alloc] init];
//4、设置界面二的代理为当前界面
secVC.delegate = self;
[self presentViewController:secVC animated:YES completion:nil];
}
//5、实现代理方法获取传值使用
- (void)sendMessage:(NSString *)text{
//在此对传递的值做需要的操作
NSLog(@"text = %@", text); //打印结果:text = 我是传递的值
}
@end
3、最后给大家简单介绍一下通知传值的用法,举例代码如下:
(1)在界面二的.m中发送通知
//例如在返回按钮事件中实现传值
- (void)btnWasClicked:(UIButton *)ban{
//1、发送通知消息
// 其中“sendMessage”为通知名称
//通过字典@{@"message":@"我是传递的值"}以键值对的形式来赋值
[[NSNotificationCenter defaultCenter] postNotificationName:@"sendMessage" object:self userInfo:@{@"message":@"我是传递的值"}];
//返回上一个界面
[self dismissViewControllerAnimated:YES completion:nil];
}
(2)在界面一中注册通知观察者并实现方法获取传值
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
//2、注册观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(achiveMessage:) name:@"sendMessage" object:nil];
}
//3、实现通知方法获取传值
-(void)achiveMessage:(NSNotification *)noti{
//传递的值保存在通知的userInfo中
NSDictionary * dic = noti.userInfo;
//在此对传输的数据进行需要的操作
NSLog(@"message = %@", [dic objectForKey:@"message"]); //打印结果:message = 我是传递的值
}
//4、重写dealloc方法移除通知 如果不移除有可能会造成程序崩溃
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
OK!到此全部简述完了。代码没有全部展示,但是用到的部分已经全部展示了出来。如果有哪里不是很清楚的地方可以问小编,小编会在第一时间回复你。
最后,还是希望能够帮到各位做开发的程序猿们,希望同是程序猿的我们能够共同学习进步!