文档章节

iOS Block回调

zzyong_iOS
 zzyong_iOS
发布于 2016/03/03 20:12
字数 888
阅读 17
收藏 0
点赞 1
评论 0

前言    

    相信大家都觉得使用block会给开发带来很大的便利,block可以轻松实现控件之间的数据传递,对于代理/通知/block三者之中,我个人也是非常倾向于使用block,但是使用block需要注意内存管理问题,不然很容易造成循环引用,造成内存泄露,对于block的知识请自行百度,我今天给大家演示:

1)controller之间的block传值,

2)controller 与 view 之间的block传值;

希望此文章会给大家一些启发,由于水平有限,如有错误望指正.废话不多说,直接上代码.

项目目录

场景一 controller之间的block传值 

    首先创建两个控制器类 ViewController 与 oneViewController,其中ViewController中有一个next按钮,点击会push到oneViewController.先看oneViewController

//
//  OneViewController.h
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//

#import <UIKit/UIKit.h>
typedef NSString* (^OneCallBackBlock)();
@interface OneViewController : UIViewController

- (instancetype) initCallBack:(OneCallBackBlock)callbackBlock;

@end

//
//  OneViewController.m
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//

#import "OneViewController.h"
#import "TwoView.h"
@interface OneViewController ()
@property (nonatomic,copy) OneCallBackBlock callbackBlock;
@property (weak, nonatomic ) IBOutlet UILabel  *titleView;
@end
@implementation OneViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    //0.初始化设置
    self.title = @"One";
    _titleView.textColor = [UIColor blackColor];
    _titleView.text = nil;
    
    //1.添加twoView
    __weak typeof(self) weafSelf = self;
    TwoView *two = [[TwoView alloc] initWithBlock:^() {
        // block 实现controller 与 view 之间的数据传递
        UIViewController *three = [[UIViewController alloc] init];
        three.view.backgroundColor = [UIColor grayColor];
        three.title = @"TwoViewControll";
        [weafSelf.navigationController pushViewController:three animated:YES];
    }];
    two.frame = CGRectMake(0, CGRectGetMaxY(_titleView.frame) + 10, self.view.bounds.size.width, 40);
    two.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:two];
    
    //2.添加rightBarButtonItem
    UIBarButtonItem  *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"获取" style:UIBarButtonItemStyleDone target:self action:@selector(getViewControllerTitle)];
    self.navigationItem.rightBarButtonItem = rightItem;
    
    //3.如不自动获取ViewController的标题,则3秒后自动获取
    [self AutoGetViewControllerTitle];
}
#pragma mark - 私有方法
//类似于AFNetworking加载网络数据完成时的回调
- (void) AutoGetViewControllerTitle{
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        if (_titleView.text.length) {
            return ;
        }
        _titleView.text =  _callbackBlock();
        self.navigationItem.rightBarButtonItem.enabled = NO;
        NSLog(@"自动返回ViewControllerTitle");
    });
}

//获取ViewController的标题
- (void) getViewControllerTitle{
    if (_titleView.text.length) {
        return ;
    }
    _titleView.text =  _callbackBlock();
    NSLog(@"%@",_callbackBlock());
}
- (instancetype)initCallBack:(OneCallBackBlock)callbackBlock{
    if (callbackBlock) {
        _callbackBlock = callbackBlock;
    }
    return self;
}
@end

现在看ViewController的代码

//
//  ViewController.h
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
//
//  ViewController.m
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//
#import "ViewController.h"
#import "OneViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (IBAction)next:(UIBarButtonItem *)sender {
    
    __weak typeof(self) weakSelf = self;
    OneViewController *one = [[OneViewController alloc] initCallBack:^NSString *{
        return [NSString stringWithFormat:@"返回第一个控制器的标题:%@",weakSelf.title];
    }];
    
    [self.navigationController pushViewController:one animated:YES];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"VC";
}
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"进入--ViewController");
}
- (void)dealloc {
    NSLog(@"ViewController--dealloc");
}
@end

    控制器之间传值中,我使用一个item主动获取 和 采用延时来自动获取ViewController的标题,OneViewController不依赖ViewController也可以轻松获取其title,具体请看注释.


场景二 controller 与 view 之间的block传值     

    首先先定义一个TwoView继承与UIView,用于跟控制器之间进行交互,当点击view的按钮时,就会通过block回调给OneViewController,也就是反馈到控制器了,此时OneViewController将会push控制器three,假如读者想传递模型数据给控制器,可以创建带参数的block,,然后在控制器中定义一个模型属性.下面请看TwoView类里面的代码

//
//  TwoView.h
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//
#import <UIKit/UIKit.h>
typedef void (^TwoFeedBack)();

@interface TwoView : UIView
- (instancetype) initWithBlock:(TwoFeedBack)block;
@end

//
//  TwoView.m
//  block
//
//  Created by zzyong on 16/2/27.
//  Copyright © 2016年 zzyong. All rights reserved.
//

#import "TwoView.h"
@interface TwoView ()
@property (nonatomic,copy) TwoFeedBack block;
@property (nonatomic,weak) UIButton *button;
@end
@implementation TwoView
- (instancetype) initWithBlock:(TwoFeedBack)block{
    if (self = [super init]) {
        
        _block = block;
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setTitle:@"跳转到第三个控制器" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(feedBack) forControlEvents:UIControlEventTouchUpInside];
        [button setBackgroundColor:[UIColor redColor]];
        [self addSubview:button];
        _button = button;
    }
    return self;
}
- (void) feedBack{
    if (_block) {
        _block();
    }
}
- (void)layoutSubviews{
    [super layoutSubviews];
    _button.frame = CGRectMake(0, 5, self.bounds.size.width, 30);
}
- (void)dealloc{
    NSLog(@"TwoView--dealloc");
}
@end

© 著作权归作者所有

共有 人打赏支持
zzyong_iOS
粉丝 0
博文 2
码字总数 1554
作品 0
广州
iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song ⋅ 05/25 ⋅ 0

iOS源码补完计划--AFNetworking(二)

目录 前言 AFNetworkReachabilityManager.h AFNetworkReachabilityManager.m API注释Demo 参考资料 前言 AFNetworking源码第二篇 主要看了看AFNetworkReachabilityManager的内容 作为一个辅助...

kirito_song ⋅ 05/16 ⋅ 0

开发微信H5视频秀项目遇到的坑

介绍 手头上正好有个项目,需要做一个微信端H5视频秀的一个项目,想想好像挺简单的,由两个视频组成,播放完第一个视频后点击按钮继而播放第二个视频。好了,结果微信的坑TM的多 问题排查 自...

🚲Allen ⋅ 05/18 ⋅ 0

Unity与IOS交互,调用IOS系统相机和相册

前面两篇总结了一下unity与android的简单交互和调用安卓系统相机和相册,比较蛋疼的是,后来发现不同的测试机上会有不同的bug。。。下阶段要一个一个的解决一下 今天总结一下与IOS的交互。这...

qq_32587659 ⋅ 05/16 ⋅ 0

说说 NSTimer 的新 API

本文是我首发在iOS知识小集团队的,欢迎关注微博话题#ios知识小集#。 在以往的 iOS 版本中,我们为了避免 NSTimer 的循环引用问题,一个比较常用的解决办法是为 NSTimer 添加一个 category,...

halohily ⋅ 05/03 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

iOS 端富文本控件 - NudeIn

NudeIn NudeIn 是一个基于 UITextView ,书写风格类似于 masonry 的 iOS 端富文本控件,它采用优雅的声明式方法定义富文本控件,和编程式的不同,它所需的代码量相当短,且非常直观易用。 Us...

HJ-CAI ⋅ 06/03 ⋅ 0

iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件(http://www.code4app.com/thread-14507-1-1.html) iOS高仿微信完整项目源码(http://www.code4app.com/thread-14695-1-1.html)......

sunnyaigd ⋅ 06/12 ⋅ 0

经过阿里,百度一面,二面后,我总结了50道iOS面试题

前言: 金三银四已经过去,根据统计,很多人都会选择在三月四月跳槽,原因有很多,企业年后会有大量员工离职,员工觉得老公司待遇不怎么样?薪资不够高,想换个新环境等等原因,所以,三月四...

原来是泽镜啊 ⋅ 05/04 ⋅ 0

Unity调用IOS的StoreKit实现在游戏内部的对游戏进行星级评价和评论

一 Xcode端的OC代码 在Xcode里面新建一个空的工程(不会搞的百度一下),然后创建一个.h和.m文件,记住要把.m的后缀改成.mm(.mm文件和.m文件的区别就是:.mm文件除了可以包含Objective-C和C...

caohonghong123 ⋅ 04/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

面试-JVM 内存结构

JVM 内存结构

秋日芒草 ⋅ 3分钟前 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 26分钟前 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 58分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 今天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 今天 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 今天 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 今天 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部