iOS block 回调

说明:本文是在了解block基础知识基础上的应用,假定阅读者已经具备block基础知识。

目的:通过block回调方式将SecondViewController中的值传入到ViewController中,在某些时候,通过block回调,可以避免delegate的繁琐

1,新建Single View Application工程,新建SecondViewController

2,在ViewController中添加UILabel用于显示SecondViewController传过来的值,把label设置为成员变量,添加一个UIButton,用于点击跳转到SecondViewController

@interface ViewController (){
    UILabel *_label;
}

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    //添加UIButton,用于跳转到SecondViewController
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 200, 300, 44)];
    [btn setTitle:@"ToSecondViewController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor grayColor];
    [btn addTarget:self action:@selector(toSecondViewController) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

    //添加UILabel,用于显示SecondViewController传过来的值
    _label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 300, 44)];
    _label.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:_label];

}

3,在SecondViewController.m中添加一个UITextField,设置为成员变量,用于输入值,添加一个UIButton,用于点击跳转回ViewController

@interface SecondViewController (){
    UITextField *_textField;
}

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    //添加一个按钮用于返回ViewController
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 200, 300, 44)];
    [btn setTitle:@"BackToViewController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor blueColor];
    [btn addTarget:self action:@selector(backToViewController) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

    //添加一个UITextField
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 300, 44)];
    _textField.backgroundColor = [UIColor greenColor];
    [self.view addSubview:_textField];
}

4,在SecondViewController.h中,利用typedef定义一个block,并设置成property,同时声明一个回调方法

#import <UIKit/UIKit.h>

//定义一个block
typedef void (^ReturnValueBlock)(NSString *value);

@interface SecondViewController : UIViewController

@property (nonatomic,copy)ReturnValueBlock returnValueBlock;

//回调方法
- (void)returnValue:(ReturnValueBlock)block;

@end

5,实现回调方法,并且在点击返回ViewController按钮时调用

- (void)backToViewController {
    //当点击返回ViewController时回调
    if (self.returnValueBlock != nil) {
        self.returnValueBlock(_textField.text);
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)returnValue:(ReturnValueBlock)block {
    self.returnValueBlock = block;
}

6,在ViewController.m中使用block方法为label赋值

- (void)toSecondViewController {
    SecondViewController *second = [[SecondViewController alloc] init];
    [second returnValue:^(NSString *value) {
        _label.text = value;
    }];

    [self presentViewController:second animated:YES completion:nil];
}

源码地址:https://github.com/rokistar/PassValueUsingBlock

时间: 2024-10-11 12:29:28

iOS block 回调的相关文章

ios Block学习

ios block 回调传值,回调事件, 直接上代码 在firstVC里面的tableView 点击方法 ,里面点击跳到另一个nextVC,然后返回后的firstVC后回调值 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NextViewController *next=[[NextViewController alloc]init]; __block Nex

iOS开发-Block回调

关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发中Block在回调过程中的是非常适合开发使用,不管是苹果的官方的接口还是一些第三方库的接口中都用到了Block回调.很多情况下Block和GCD一起使用,最常见的场景的就是App去后台取数据的过程中是需要时间,数据取成功之后我们才能更新UI页面,这就是最常见的回调的方式,也可以通过Notificat

IOS Block的回调

// Student.h #import <Foundation/Foundation.h> @interface Student : NSObject - (void)PlayBeforeExam:(void(^)(NSString*))TakingMakeUpExam Punish:(void(^)(void))CompletionHandler; @end // Student.m #import "Student.h" @implementation Student

iOS 简单易懂的 Block 回调使用和解析

老实说在早前我已经学会了如何使用 Block 来做一些方法回调,传递参数的功能,并且用 Block 简单封装了第三方的网络库(AFNetworking).虽说对 Block 的应用说不上得心应手,但是却是极其地喜欢使用这种设计模式,并且在项目中也大量地使用了. 但是,最近一位即将参加面试的学弟问我,什么是 Block 呢?我蒙圈了,但是毕竟是学长,我假装淡定地反问道:你所理解的 Block 是什么呢?学弟说:是一段封装的代码块,并可以放在任意位置使用,还可以传递数据.我心里暗喜,这孩子还是图样了

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

iOS Block循环引用

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题.对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来. 声景一:Controller之间block传值 现在,我们声明两个控制器类,一个叫ViewContr

写给喜欢用Block的朋友(ios Block)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/38090205 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 本文不讲block如何声明及使用,只讲block在使用过程中暂时遇到及带来的隐性危险. 主要基于两点进行演示: 1.block 的循环引用(retain cycle) 2.去除block产生的告警时,需注意问题. 有一次,朋友问我当一个对象中的b

(译)IOS block编程指南 1 介绍

Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block ca

iOS Block循环引用精讲

前言 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法.形成你中有我,我中有你,谁都无法将谁释放的困局.又或者解决方法简而言之就一句话的事情:__weak typeof (self) weakSelf = self; 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导