在进行页面跳转时,往往都需要携带数据,以便于对界面进行数据的初始化,方便用户查看一些信息、状态等,以下是本人在开发时总结的界面传值的几种方式:
一、属性传值
属性传值即在页面进行跳转时,直接给将要跳转的页面中的指定属性进行赋值操作,我们以页面一跳转到页面二为例,页面一仅有一个跳转按钮,跳转代码如下:
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.str = @"这是页面一给我设置的";
[self presentViewController:secondVC animated:YES completion:nil];
}
从代码可看出,在跳转到SecondViewController之前,我们先给secondVC对象中的str属性赋值了,那么在secondVC界面初始化时,即可去读取并显示str中的数据了,以下是页面二的部分代码,在跳转前,给页面二指定的属性赋值即可;
@interface SecondViewController : UIViewController
@property (strong,nonatomic) NSString *str;
@end
二、单例传值
通过单例对象来传递数据,首先创建一个单例类,并在其中定义并实现静态的单例构造方法,获取唯一的单例对象,同时在单例类中添加指定的属性,SingleInstance.h代码如下:
@interface SingleInstance : NSObject
@property (strong,nonatomic) NSString *singleStr;
+(instancetype)sharedInstance;
@end
以下是SingleInstance.m代码
@implementation SingleInstance
//通过类方法创建单例对象
+(instancetype)sharedInstance
{static SingleInstance *instance = nil;
if (instance == nil) {
instance = [[SingleInstance alloc] init];
}return instance;}
@end
单例类创建完成后,在进行页面跳转前,对单例对象中的指定属性进行赋值,然后在跳转后的页面中再读取单例对象中指定的属性值,代码如下:
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
[SingleInstance sharedInstance].singleStr = @"这是单例传值";
[self presentViewController:secondVC animated:YES completion:nil];
}
三、NSUserDefaults传值
NSUserDefaluts是系统提供的一种方法,在页面一中先传入数据到程序的沙盒当中,然后在页面二中再从沙盒中读取数据,代码如下:
页面一:[[NSUserDefaults standardUserDefaults] setObject:@"这是NSUserDefaults传值" forKey:@"NSDefaults"];
通过键值对的方式存储数据,再在页面二中通过key值读取指定的数据
页面二:_label.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"NSDefaults"];
四、block传值
block传值主要用于页面二给页面一回传数据,即进行页面的反向传值,首先需要在页面二中添加block属性,我们以传递NSString为例,代码如下:
//定义一个block,进行页面反向传值
@property (copy) void (^block)(NSString *);
其次在页面二返回到页面一时,给这个block进行传参,代码如下:
-(void)doClick
{
//block传值,反向传值
self.block(@"block传值啦");
[self dismissViewControllerAnimated:YES completion:nil];
}
在页面一中,我们需要实现页面二中的block属性进行读取数据的操作,代码如下:
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
//block传值,实现block,接收来自页面二的值
secondVC.block = ^(NSString *str){
self.label.text = str;
};
[self presentViewController:secondVC animated:YES completion:nil];
}
五、代理传值
通过代理传值,实现页面二反向传递数据给页面一,实现步骤如下:
a.委托方(页面二)持有协议并调用协议方法,代码如下:
#import <UIKit/UIKit.h>
//委托方创建一个协议
@protocol sendDataDelegate <NSObject>
//协议定义一个传值的方法
-(void)sendData:(NSString *)str;
@end
@interface SecondViewController : UIViewController
//定义一个持有协议的ID指针
@property (weak)id<sendDataDelegate> delegate;
@end
b.委托方(页面二)在跳转至代理方(页面一)时调用协议方法
-(void)doClick
{
//代理传值,反向传值
[self.delegate sendData:@"代理传值啦"];
[self dismissViewControllerAnimated:YES completion:nil];
}
c.代理方(页面一)遵守协议并实现协议的方法
@interface ViewController ()<sendDataDelegate>
@end
@implementation ViewController
//代理传值,实现协议方法,接收页面二传递的值,sendData为sendDataDelegate协议中的方法
-(void)sendData:(NSString *)str
{
self.label.text = str;
}
......
@end
d.设置委托方(页面二)的代理为代理方(页面一)
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
//设置代理为页面一
secondVC.delegate = self;
[self presentViewController:secondVC animated:YES completion:nil];
}
以上是自己总结的一些关于IOS页面传值的方式,如有其它更好的方式,欢迎提出,谢谢