美文网首页iOS积累用之iOS技术分享数据传递
iOS开发-属性、block、代理、通知传值

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

作者: it_hao528 | 来源:发表于2016-10-08 19:14 被阅读329次

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

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

    相关文章

      网友评论

      本文标题:iOS开发-属性、block、代理、通知传值

      本文链接:https://www.haomeiwen.com/subject/gheeyttx.html