代理,block,通知,对于数据回传的不同方法

原创 2015年11月18日 23:43:58

代理:
创建代理方:先要在.h文件中创建协议,设置代理方法(weak),参数类型即为想要传递的数据类型;设置满足代理的属性;
然后在.m文件方法中判断代理对象是否能够响应,能响应就让响应对象执行代理方法.
执行代理方:先要遵守代理协议,设置自身控制器为代理(易忽略),然后实现代理方法实现数据回传.

block:
创建block方:先在.h文件中设置block属性方法(copy),参数类型即为想要传递的数据类型.然后在.m文件中判断能否响应,能响应就执行block方法
执行block方:在创建了一个创建block方类的对象后,该对象便可实现block方法,在方法体中实现数据回传.

通知:
通知方:设置通知事件名称和字典(字典内即为要传递的数据)
接收方:接收对应名称的通知事件,执行收到通知后应实现的方法(取出字典中的数据即是要回传的数据),接受完后删除通知

.h文件

#import <UIKit/UIKit.h>

@protocol MydeleBlockNotyViewDelegate <NSObject>
// 代理可选方法
@optional
- (void)str:(NSString *)string;
@end

@interface MydeleBlockNotyView : UIView
// 遵守协议的代理属性
@property (nonatomic,strong) id<MydeleBlockNotyViewDelegate> delegate;
// Block方式
@property (nonatomic,copy) void (^myblock)(NSSting *);
@end

.m文件

#import "MydeleBlockNotyView.h"

@implementation MydeleBlockNotyView
- (void)drawRect:(CGRect)rect {
    // 代理的按钮
    UIButton *redBtn = [[UIButton alloc] initWithFrame:CGRectMake(50,50,80,80)];
    redBtn.backgroundColor = [UIColor redColor];
    [redBtn setTitle:@"代理" forState:(UIControlStateNormal)];
    [redBtn addTarget:self action:@selector(dele) forControlEventTouchs:(UIControlEventTouchUpInside)];
    [self addSubview:redBtn];

    // Block的按钮
    UIButton *blueBtn = [[UIButton alloc] initWithFrame:CGRectMake(150,50,80,80)];
    blueBtn.backgroundColor = [UIColor blueBtn];
    [blueBtn setTitle:@"Block" forState:(UIControlStateNormal)];
    [blueBtn addTarget:self action:@selector(block) forControlEventTouchs:(UIControlEventTouchUpInside)];
    [self addSubview:blueBtn];

    // 通知的按钮
    UIButton *greenBtn = [[UIButton alloc] initWithFrame:CGRectMake(250,50,80,80)];
    greenBtn.backgroundColor = [UIColor greenBtn];
    [greenBtn setTitle:@"通知" forState:(UIControlStateNormal)];
    [greenBtn addTarget:self action:@selector(noty) forControlEventTouchs:(UIControlEventTouchUpInside)];
    [self addSubview:greenBtn];
}

// 代理的点击事件
- (void)dele {
    NSString *myText = @"这是代理回传的值";

    if ([self.delegate respondsToSelector:@selector(str:)]) {
        [self.delegate str:myText];
    }
}

// Block的点击事件
- (void)dele {
    NSString *myText = @"这是Block回传的值";

    if (self.myblock) {
        self.myblock(myText);
    }
}

// 通知的点击事件
- (void)dele {
    NSString *myText = @"这是通知回传的值";

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNoty" object:nil userInfo:@{@"myText", myText}];
}
@end

回传接收数据方

#import "ViewController.h"
#import "MydeleBlockNotyView.h"

@interface ViewController ()<MydeleBlockNotyViewDelegate>
@property (weak,nonatomic) IBOutlet UILabel *TextLabel;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    MydeleBlockNotyView *myView = [[MydeleBlockNotyView alloc] init];
    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    myView.frame = CGRectMake(0,100,screenW,200);
    myView.backgroundColor = [UIColor orangeColor];
    myView.delegate = self;
    [self.view addSubview:myView];

    // Block实现
    myView.myblock = ^(NSSting *str){
        self.myLabel.text = str;
    };

    // 注册通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(not:) name:@"myNoty" object:nil];
}

// 实现代理方法
- (void)str:(NSString *)string {
    self.myLabel.text = string;
}

// 实现通知方法
- (void)not:(NSNotification *)noty {
    self.myLabel.text = noty.userInfo[@"myText"];
}

// 执行完后移除通知
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

执行效果图:
执行效果图

初学OC时,对三种回传方式的总结,代理和Block用法相似,传值方和接收方需有一定的关联,而通知不需要,例如当有三个视图时,要把C视图的数据传给A,这时用代理和Block比较麻烦,可以用通知来传递,而一般不太复杂的建议用代理或者Block

版权声明:本文为博主原创文章,转载请注明出处。

iOS数据回调三大利器——代理、通知与Block

iOS数据回调三大利器——代理、通知与Block引子:在实际开发中我们经常遇到需要跨方法,甚至跨文件访问数据或传输信息,跨方法是比较简单的,只要我们声明一个全局变量,并为其赋值,就可以在同一个文件中的...
  • qq_34101611
  • qq_34101611
  • 2016年04月04日 00:45
  • 776

oc三种传值方式:通知传值,代理传值,block传值

三种传值方式分别为:通知传值,代理传值,block传值 通知和代理的区别(重点) 1,代理可以给sender返回值;通知不能返回值 2,通知代理量小,代理实现步骤比较繁琐 3,通知是一对多/一对无的关...
  • tundraw
  • tundraw
  • 2015年07月16日 22:25
  • 2383

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值、block传值 那么第一个视图控制器如何获的第二个视...
  • m372897500
  • m372897500
  • 2016年05月06日 17:02
  • 1118

iOS 开发中的消息机制-代理、通知、block

http://blog.csdn.net/italianshen
  • italianshen
  • italianshen
  • 2016年05月03日 22:45
  • 677

iOS Block的基本使用以及Block传值

block为我们提供了一个非常便捷的方法去实现各种传值以及回调 合理的使用block可以减少代码量以及更加优雅的实现功能 现做个小整理如下: #pragma mark About Block ...
  • Scott_cc
  • Scott_cc
  • 2016年04月14日 15:52
  • 3408

带你5分钟搞懂 block 回调

Objective-C 中的 block 是一个类似于其他语言如 swift 中的闭包的东西。掌握好 block 的使用方法,可在项目开展中得心应手,比较常用的是 block 的回调机制。下面就由具体...
  • huangfei711
  • huangfei711
  • 2017年06月29日 21:54
  • 876

block的简单回调传值

由于block的火热,让我这个菜鸟也不得不多了解一下block的基本用法,虽然我之前用的是protocal代理的方式在页面之间进行的传值。但是,block的火热让我不得不来写一个demo学习下,好了废...
  • Lu_Ca
  • Lu_Ca
  • 2015年11月19日 14:36
  • 1791

IOS:两种回调的方式实现(delegate和block)

我要实现的效果:在ViewController里有一个Button,点击button进入BlockView。在BlockView有一个TextField,输入文字后点击完成,可以把textField里...
  • u011103194
  • u011103194
  • 2015年12月08日 15:55
  • 1728

activity回传数据

第一个activity代码: [java] view plaincopy package cn.com.chenzheng_java;      ...
  • Free_Wind22
  • Free_Wind22
  • 2014年07月18日 17:09
  • 4022

iOS block传值(逆传)

block是个好东西,是苹果官方推荐的一种方法,效率高,代码简单,今天用block主要是做一个简单传,暂时不对block详细介绍,关于__block的用法,后期会一一介绍; 接下来,通过一个block...
  • Arodung
  • Arodung
  • 2016年05月31日 23:36
  • 1037
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代理,block,通知,对于数据回传的不同方法
举报原因:
原因补充:

(最多只允许输入30个字)