文档章节

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
ReactNative与iOS原生交互方式汇总

前言 最近用RN开发SDK,涉及RN与iOS各种交互。 有些交互比如用iOS原生切换多个RN页面,以及iOS调用RN的方法,按照网上的方法调不通,一度不知如何是好,网上资料比较少。 于是自己看RN源码分...

大灰狼的小绵羊哥哥
11/13
0
0
iOS奇思妙想之使用block替代通知

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

季末微夏
08/17
0
0
iOS源码补完计划--AFNetworking(二)

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

kirito_song
05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

添加并发

<!-- 认购线程池,支持最大并发送10 最大排队队列为一万--> <task:executor id="investBuyPool" pool-size="1-10" queue-capacity="10000"/> 方法添加注解@Async("investBuyPool")......

一夜
13分钟前
1
0
Gensim?

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训...

火力全開
26分钟前
1
0
图片验证码

图片验证码,线上登录是最常见的场景,也有发送手机验证码之前进行图片验证码的验证。 图片验证码很大程度上防止机器人撞库登录或频繁发起短信验证码从而使系统暂时性"瘫痪"。 以下是项目中用...

貔貅叔
29分钟前
3
0
科班出身程序员和培训出来的程序员区别在哪?

科班出身只是代表你要从事的职业和你的专业是一致的,代表着你具备了得天独厚的优势,至于是不是优势看你上班好不好学,平时逃课没,上班是认真听还是玩手机。一般而言科班出来的理论性比较强...

java菜分享
29分钟前
1
0
java框架学习日志-8(AOP简介)

小王被委托开发一款游戏,程序分为启动页面,登陆页面,战斗页面等。小王就采用了面向对象编程思想(OOP),把整个程序分解成下图 这种就是传统的自上而下的编程,或者说纵向的编程,负责启动...

白话
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部