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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容