几种常见的页面传值方式:
实现A与B界面传值,需要新建两个UIViewController , A --> ViewController ; b --> BUIViewController
ViewController.h
#import
@interface ViewController : UIViewController
@end
考虑使用导航条作为跳转机制,在 AppDelegate 中添加 UINavigationController
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
//创建导航控制器
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController: [[ViewController alloc]init]];
//设置window的根控制器
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
为实现A-->B 属性传值,需要在B中添加属性。然后在跳转钱给B中的属性赋值,在B中获取自己的属性值就OK了。
//
// BViewController.h
// 界面传值Demo
//
#import
@interface BViewController : UIViewController
/** 属性传值参数 */
@property(nonatomic, strong)NSString *BValue;
@end
在B中获取属性值关键代码。
//属性传值 :读取属性值显示在text filed中
_textField.text = self.BValue;
NSLog(@"%@ -- %@",[self class],self.BValue);
A中在,给跳转的控制器中的属性赋值关键代码。
BViewController *BVC = [[BViewController alloc]init];
// 属性传值给B
NSString *textfieldStr = self.textField.text;
// BVC.BValue = @"属性传值:A --> B";
BVC.BValue = textfieldStr;
[self.navigationController pushViewController:BVC animated:YES];
效果么,很简单的的东西。B中简单的打印下 log 如下。
<2018-03-16 10:09:33> [Info][BViewController.m:57] BViewController -- Abcd [fg;
详细代码如下:
//
// ViewController.m
// 界面传值Demo A 界面
//
#import "ViewController.h"
#import "BViewController.h"
#import "MyInstance.h"
@interface ViewController ()
//准备在界面创建两个控件,一个输入文字,一个用来跳转
@property (strong,nonatomic) UIButton *button;
@property (strong,nonatomic) UITextField *textField;
@end
@implementation ViewController
- (UIButton *)button{
if(!_button ){
_button = [[UIButton alloc]initWithFrame:CGRectMake(100, 300, 200, 40)];
[_button setBackgroundColor:[UIColor grayColor]]; //背景颜色
[_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];//字体颜色
_button.titleLabel.font = [UIFont systemFontOfSize:18];//字体大小
[_button setTitle:@"go to B View" forState:UIControlStateNormal];
[_button addTarget:self action:@selector(btOnClick) forControlEvents:UIControlEventTouchUpInside];//添加点击事件
}
return _button;
}
- (UITextField *)textField{
if(!_textField ){
_textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];
_textField.textColor = [UIColor blackColor];
_textField.borderStyle = UITextBorderStyleLine;//设置一个边框样式
[_textField setFont:[UIFont systemFontOfSize:18]];
}
return _textField;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"A 界面";
//设置返回键内容 ,跳转下一个界面时不会默认显示上一个界面的title内容
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];
self.navigationItem.backBarButtonItem = backItem;
//将控件 加载到View上
[self.view addSubview:self.button];
[self.view addSubview:self.textField];
}
//点击事件
-(void)btOnClick{
BViewController *BVC = [[BViewController alloc]init];
// 属性传值给B
NSString *textfieldStr = self.textField.text;
// BVC.BValue = @"属性传值:A --> B";
BVC.BValue = textfieldStr;
[self.navigationController pushViewController:BVC animated:YES];
}
@end
//
// BViewController.m
// 界面传值Demo
//
#import "BViewController.h"
#import "MyInstance.h"
@interface BViewController ()
//准备在界面创建两个控件,一个输入文字,一个用来跳转
@property (strong,nonatomic) UIButton *button;
@property (strong,nonatomic) UITextField *textField;
@end
@implementation BViewController
- (UIButton *)button{
if(!_button){
_button = [[UIButton alloc]initWithFrame:CGRectMake(100, 300, 200, 40)];
_button.backgroundColor = [UIColor grayColor]; //背景颜色
[_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];//字体颜色
_button.titleLabel.font = [UIFont systemFontOfSize:18];//字体大小
[_button setTitle:@"返回" forState:UIControlStateNormal];
//添加点击事件
[_button addTarget:self action:@selector(BackClick) forControlEvents:UIControlEventTouchUpInside];
}
return _button;
}
- (UITextField *)textField{
if(!_textField){
_textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 150, 200, 40)];
_textField.textColor = [UIColor redColor];
_textField.borderStyle = UITextBorderStyleLine;
[_textField setFont:[UIFont systemFontOfSize:18]];
}
return _textField;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];//设置背景颜色为白色
self.navigationItem.title = @"B 界面";
[self.view addSubview:self.button];
[self.view addSubview:self.textField];
//属性传值 :读取属性值显示在text filed中
_textField.text = self.BValue;
NSLog(@"%@ -- %@",[self class],self.BValue);
}
//点击事件 -- 返回
-(void)BackClick{
[self.navigationController popViewControllerAnimated:YES];
}
@end
在一的前提,任然使用AB两个界面来传参演示。当然要实现单例传参,就需要创建一个单例对象。先简单写一个单例,一个参数。
//
// NyInstance.h
// 界面传值Demo
//
#import
@interface MyInstance : NSObject
/** 单例属性 */
@property(nonatomic, strong)NSString *value;
+(instancetype)sharedInstance;
@end
//
// NyInstance.m
// 界面传值Demo
//
#import "MyInstance.h"
@implementation MyInstance
+(instancetype)sharedInstance{
static MyInstance *myInstance = nil;
if(myInstance == nil){
myInstance = [[MyInstance alloc]init];
}
return myInstance;
}
@end
在A 中的Button点击事件中向单例属性赋值,B加载完界面后获取单例属性值,并log或者显示在text filed中。代码如下:
//点击事件
-(void)btOnClick{
BViewController *BVC = [[BViewController alloc]init];
// 属性传值给B
// NSString *textfieldStr = self.textField.text;
// BVC.BValue = @"属性传值:A --> B";
// BVC.BValue = textfieldStr;
//给单例属性赋值 传值 A --> B
MyInstance.sharedInstance.value = @"单利属性value";
[self.navigationController pushViewController:BVC animated:YES];
}
在B中获取属性值:
//接受单利数据显示在 text filed中
_textField.text = MyInstance.sharedInstance.value;
NSLog(@"%@ 单例 %@",[self class],MyInstance.sharedInstance.value);
B --> A 反向传值。实现思想,B中我们使用的一个按钮点击返回A,在A将要显示的时候加载数据。
B中代码如下:
//点击事件 -- 返回
-(void)BackClick{
//返回A界面的时候设置单例属性内容
MyInstance.sharedInstance.value = @"B-->A :单例值";
[self.navigationController popViewControllerAnimated:YES];
}
A中代码如下:
//在界面将要显示的时候设置或者更变文本内容
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.textField.text = MyInstance.sharedInstance.value;
LogError(@"%@ -单例 接受B传来的值 -%@",[self class],MyInstance.sharedInstance.value);
}
在实现A -- B -- A的过程我们打印的日子如下
[f<2018-03-16 11:13:21> [Info][BViewController.m:61] BViewController 单例 单利属性value [fg;
[<2018-03-16 11:13:24> [Error][ViewController.m:79] ViewController -单例 接受B传来的值 -B-->A :单例值 [fg;
总结:这里只是使用简单的字符串传值实现,我们也可以定义复杂的对象来实现等等 。属性传值只能单向传递;单例传值,实际是在内存中创建了一个空间,在界面中我们从中获取属性值来实现需求。
NSUserDefaults跟单例类似,只不过NSUserDefaults是将数据写入到文件中(沙盒文件)。
如上图,我们可以看出沙盒文件传流程。同样我们在A跟B之间的传值,方式如上图,在A跳转到B的时候讲数据写入文件中,待B中读取。
关键代码:A跳转B前 写入数据:
//NSUserDefaults 传值
[[NSUserDefaults standardUserDefaults]setObject:@"object-value" forKey:@"value-key"];
[[NSUserDefaults standardUserDefaults]synchronize];//同步、保存
[self.navigationController pushViewController:BVC animated:YES];
B中读取数据:
//NSUserDefaults 接受读取数据
NSLog(@"%@ NSUserDefaults %@",[self class],[[NSUserDefaults standardUserDefaults] objectForKey:@"value-key"]);
LOG打印:
[BViewController.m:64] BViewController NSUserDefaults object-value [fg;
因为是将数据写入到沙盒文件中,我们都可以在需要的时候去读取。A中获取B中的传值,跟单例反响传值类似,只不过我们是将数据写入文件中,再从文件中读取。
经验值 :+50
级别:小菜鸟
下一章:代理传值与block传值:IOS 界面传值实现的6种方式(二)