几种常见的页面传值方式:
1.属性传值
2.单例传值
3.NSUserDefaults传值
4.block传值
1.单例传值和属性传值
ViewController.h:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "NextViewController.h"
#import "defaultInstance.h"
@interface ViewController ()
@property(nonatomic,strong) UILabel *label;
@property(nonatomic,strong) UIButton *btn;
@end
@implementation ViewController
-(UILabel *)label{
if (_label==nil) {
_label=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];
_label.backgroundColor=[UIColor blueColor];
_label.textColor=[UIColor redColor];
// _label.font=[UIFont systemFontSize:20];
_label.font = [UIFont systemFontOfSize:20];
}
return _label;
}
-(UIButton *)btn{
if (_btn==nil) {
_btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 300, 200, 40)];
_btn.backgroundColor = [UIColor brownColor];
[_btn setTitle:@"跳转页面2" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)btnClick{
NextViewController *nextVc = [[NextViewController alloc] init];
//属性传值
nextVc.str = @"属性传值";
[defaultInstance sharedInstance].str = @"单例传值";
[self presentViewController:nextVc animated:YES completion:nil];
}
//页面显示的时候
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//接受页面2的反向传值
self.label.text = [defaultInstance sharedInstance].str;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.label];
[self.view addSubview:self.btn];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
NextViewController.h:
#import <UIKit/UIKit.h>
@interface NextViewController : UIViewController
@property(strong,nonatomic) NSString *str;
@end
NextViewController.m
#import "NextViewController.h"
#import "defaultInstance.h"
@interface NextViewController ()
@property(strong,nonatomic)UITextField *textField;
@property(strong,nonatomic)UIButton *btn;
@end
@implementation NextViewController
//懒加载
-(UITextField *)textField{
if (!_textField) {
_textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 40)];
_textField.borderStyle = UITextBorderStyleLine;
_textField.textColor = [UIColor blackColor];
//属性传值接受
_textField.text = self.str;
_textField.text = [self.str stringByAppendingString:[defaultInstance sharedInstance].str];
}
return _textField;
}
-(UIButton *)btn{
if (!_btn) {
_btn = [[UIButton alloc]initWithFrame: CGRectMake(100, 300, 200, 40)];
_btn.backgroundColor= [UIColor redColor];
[_btn setTitle:@"跳回页面1" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor whiteColor]forState:UIControlStateNormal];
_btn.titleLabel.font = [UIFont systemFontOfSize:20];
[_btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)btnClick{
// 单例模式反向传递
[defaultInstance sharedInstance].str = self.textField.text;
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor= [UIColor whiteColor];
[self.view addSubview:self.textField];
[self.view addSubview:self.btn];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
单例类:
defaultInstance.h
#import <Foundation/Foundation.h>
@interface defaultInstance : NSObject
+(instancetype)sharedInstance;
@property(strong,nonatomic)NSString *str;
@end
defaultInstance.m
#import "defaultInstance.h"
#import "defaultInstance.h"
@implementation defaultInstance
//通过类方法创建单例对象
+(instancetype)sharedInstance{
//静态变量一旦被赋值,下次使用是用上次的值(每次保留上次的值)
static defaultInstance *sharedVc = nil;
if (sharedVc==nil) {
sharedVc = [[defaultInstance alloc] init];
}
return sharedVc;
}
@end