在iOS开发中,我们会在实际过程中大量使用Block,其中Block有个很基础的功能,就是完成两个页面间的传值。而今天,我就用实际的项目中的页面,来展示如何完成两个页面间的传值。
首先我们先来看,这个界面中,我们需要传递什么值。我们需要在点击选择房间之后,跳转到房间列表界面,在UITableViewController
中,选择房间名,之后按下确定
按钮后,跳转回第一个界面,使我们选择的房间名,显示在房间
选项处。
房间列表界面
因为事件其实是发生在第二个界面,按下确定
按钮时,所以我们在第二个界面,声明并定义Block。
typedef void(^SelectedRoomBlock)(NSString *roomName);
@interface SelectRoomTypeVC : UIViewController
@property (nonatomic, copy) SelectedRoomBlock selectedRoomBlock;
- (void)returnRoomName:(SelectedRoomBlock)block;
-
我们先用
typedef
声明一个叫SelectedRoomBlock
的Block
,它需要有一个类型为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在两个页面间的传值,效果如上图,是不是其实也特别简单呢。