文档章节

iOS Block回调

zzyong_iOS
 zzyong_iOS
发布于 2016/03/03 20:12
字数 888
阅读 17
收藏 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
广州
UIViewPropertyAnimator 简介(一)

目前在 UIKit 至少有三种创建动画的方法。iOS 4 之前的 begin/commit 方式,以及在 iOS 4 中引入的 block 方式。在 iOS 10 发布的时候,UIKit 新增了一个创建动画的专用类 UIViewPropertyAn...

智小融
07/09
0
0
iOS与JS交互之WKWebView-WKUIDelegate协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKUIDelegate」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端...

QiShare
09/03
0
0
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/01
0
0
iOS奇思妙想之使用block替代通知

前言 iOS开发中,很多情况下会使用到通知,通知的好处很多,但是也有很多坑点,一旦没有管理好,就会造成很多莫名其妙的bug。既然通知使用不当很容易出现问题,那有没有什么办法来避免?经过...

季末微夏
08/17
0
0
iOS源码补完计划--AFNetworking 3.1.0源码研读

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

kirito_song
05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
8
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
7
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
9
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部