iOS开发——Block在实际项目中的传值

在iOS开发中,我们会在实际过程中大量使用Block,其中Block有个很基础的功能,就是完成两个页面间的传值。而今天,我就用实际的项目中的页面,来展示如何完成两个页面间的传值。

首先我们先来看,这个界面中,我们需要传递什么值。我们需要在点击选择房间之后,跳转到房间列表界面,在UITableViewController中,选择房间名,之后按下确定按钮后,跳转回第一个界面,使我们选择的房间名,显示在房间选项处。

房间列表界面

因为事件其实是发生在第二个界面,按下确定按钮时,所以我们在第二个界面,声明并定义Block。

typedef void(^SelectedRoomBlock)(NSString *roomName);

@interface SelectRoomTypeVC : UIViewController

@property (nonatomic, copy) SelectedRoomBlock selectedRoomBlock;

- (void)returnRoomName:(SelectedRoomBlock)block;
  • 我们先用typedef声明一个叫SelectedRoomBlockBlock,它需要有一个类型为NSString的参数。
  • 之后我们声明一个类型为SelectedRoomBlock的变量selectedRoomBlok
  • 我们定义一个函数,需要传入一个Block类型的参数,这个方法不用也可以,目的是为了减少代码量,使我们使用Block的过程更加清晰。

接下来我们就要开始来使用Block传值了,我们先来实现刚刚定义的函数方法。

- (void)returnRoomName:(SelectedRoomBlock)block{
    self.selectedRoomBlock = block;
}

很清晰的实现,就是为了再后来调用时,出现一个Block代码块,更加清晰。

把传进来的Block语句块保存到本类的实例变量selectedRoomBlock(.h中定义的属性)中,然后寻找一个时机调用,而这个时机就是上面说到的,当确认按钮按下时。

之后声明一个字符串类型的变量,保存我们刚刚存储的房间的值。

@property (nonatomic, copy) NSString *selectedRoomStr;

而获取值在UITableView的代理方法中实现,这里就不赘述了。

因为我们按下确定按钮开始传值,所以我们在ButtonAction中来实现。

-  (void)ButtonAction:(UIBarButtonItem *)sender{
    switch (sender.tag) {
        case 107:{
            if (self.selectedRoomBlock != nil) {
                self.selectedRoomBlock(self.selectedRoom);
            }
            [self.navigationController popViewControllerAnimated:YES];
            break;
        }
        
        default:
            break;
    }
}

第一个视图界面

我们回到第一个视图界面,在Push出第二个界面时生成第二个界面的地方,调用我们的Block属性。

 [self.navigationController pushViewController:_selectRoomVC animated:YES];
    
 [_selectRoomVC returnRoomName:^(NSString *roomName) {
         _addDeviceCellInfo.roomName = roomName;
   }];

这里我们就可以用任意的变量,来匹配Block传递进来的roomName参数。

至此,就已经完成了Block在两个页面间的传值,效果如上图,是不是其实也特别简单呢。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jimoer

JVM学习记录-类加载器

JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的...

8510
来自专栏Danny的专栏

【J2SE快速进阶】——Java多线程机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

10230
来自专栏枕边书

PHP模拟发送POST请求之二、用PHP和JS处理URL信息

明白了HTTP请求的头信息后,我们还需要对请求地址有所了解。再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻。 在P...

24850
来自专栏york技术分享

sed 使用教程 - 通读篇(30分钟入门系列)

和上篇 awk 分享一样,作为通读性的分享,不想引入太过复杂的东西,依然从日常工作中碰到的 80% 的需求出发,重点阐述最重点的部门,工作原理等,普及一些对se...

527220
来自专栏逸鹏说道

C# 温故而知新:Stream篇(四)上

FileStream 目录: 如何去理解FileStream? FileStream的重要性 FileStream常用构造函数(重要) 非托管参数SafeFil...

35550
来自专栏北京马哥教育

经典!Python运维中常用的几十个Python运维脚本

file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建。但是更推荐使用内置...

49250
来自专栏coding

python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默

Python 使用被称为 异常 的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异...

32320
来自专栏Linux驱动

42.Linux应用调试-初步制作系统调用(用户态->内核态)

1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面...

25850
来自专栏jeremy的技术点滴

Retrying_Library_For_Java

35650
来自专栏MoeLove

[译]Tornado协程

Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同...

10820

扫码关注云+社区

领取腾讯云代金券