iOS积累用之iOS技术分享数据传递

iOS开发-属性、block、代理、通知传值

2016-10-08  本文已影响329人  it_hao528

传值在开发中我们会经常用到,传值又分为正向传值和反向传值。从界面一跳转到界面二且将值从界面一传递给界面二使用,称之为正向传值;从界面一跳转到界面二,从界面二返回界面一时将值传递给界面一使用,称之为反向传值。在此,小编给大家详细讲解几种正向传值和反向传值常用到的方法。

一、正向传值
常用到的正向传值是属性传值,方便简单。举例代码如下:
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!到此全部简述完了。代码没有全部展示,但是用到的部分已经全部展示了出来。如果有哪里不是很清楚的地方可以问小编,小编会在第一时间回复你。
最后,还是希望能够帮到各位做开发的程序猿们,希望同是程序猿的我们能够共同学习进步!

上一篇 下一篇

猜你喜欢

热点阅读