IOS 界面传值实现的6种方式(一)

iOS 界面传值实现的6种方式

    几种常见的页面传值方式:

  1. 属性传值
  2. 单例传值
  3. NSUserDefaults传值
  4. 代理传值
  5. block传值
  6. 通知传值

    

一、属性传值

    实现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跟单例类似,只不过NSUserDefaults是将数据写入到文件中(沙盒文件)。

IOS 界面传值实现的6种方式(一)_第1张图片

    如上图,我们可以看出沙盒文件传流程。同样我们在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种方式(二)

你可能感兴趣的:(IOS,随堂笔记)