Block传值(从后向前传值)
Block的核心思想是 : 回调,Block作为属性进行传值的时候,一般使用场景是从第二个界面返回到上一个界面,基本步骤:
1.在第二个界面中声明一个 Block 属性
2.在第二个界面返回的那句代码之前加上 Block 需要传递的内容
3.在一个界面推出第二个界面那句代码之前,对 Block 进行实现(即接受 Block 传递过来的内容)
第一步:声明 Block 属性 参数名要带上,因为要参与运算(写入的.h 中声明)
@property (nonatomic, copy)void(^changeViewBlock)(NSString *string);
第二步:在跳转回接收值页面之前将要传递的内容给 block 属性
- (void)popButtonActioon
{
第二步:将要传递的内容通过属性 block 传给它
self.changeViewBlock(self.textfield.text);
跳转会接收值页面
[self.navigationController popViewControllerAnimate d:YES];
}
在接收值页面接收 block 传过来的值(在 push 过去之前接收)
- (void)pushButtonAction
{
SecondViewController *secondVC = [[SecondViewController alloc]init];
secondVC.concent = self.showTextLabel.text;
__weak 可以改成弱引用,防止重复引用
__weak typeof(self) weakSelf = self;
第三步:实现 block 的内容(接受传递过来的内容)
secondVC.changeViewBlock = ^(NSString *string){
weakSelf.showTextLabel.text = string;
};
[self.navigationController pushViewController:secondVC animated:YES];
}
第二种 block 传值
总结:Block 作为方法参数传值应用场景:一般是在处理数据的 Model进行使用;具体步骤:
1.对 Block 进行 typedef
2.声明方法使Block 作为方法参数
3.实现声明的方法,将要传递的内容传递出去
4.实现 Block 的回调
第一步 :Block 的重定义
typedef void(^AppDateSourceBlock)(NSString *string);
@interface AppDateSource : NSObject
第二步:声明方法,让 Block 作为方法参数
- (void)sendMassage:(NSString *)string(这个地方写什么类型的就传什么类型的) andBlock:(AppDateSourceBlock)block;
@end
#warning 第三步:实现 Block 作为方法参数的那个方法
- (void)sendMassage:(NSString *)string andBlock:(AppDateSourceBlock)block
{
NSString *string1 = [NSString stringWithFormat:@"%@",string];
block(string1);
}
- (void)sendMassageAction
{
#warning 第四步:Block 回调,即实现 Block
AppDateSource *dataBlock = [[AppDateSource alloc]init];
[dataBlock sendMassage:@"hello" andBlock:^(NSString *string) {
self.showTextLabel.text = string;
}];
}
协议传值(从后往前传)
总结:属性传值:一般使用从前往后进行传值的情况
如果从后往前,需要借助其他传值方式即 block 传值
协议传值方式
* 实现协议的六个步骤
第一步:声明协议
第二步:声明代理⼈
第三步:执⾏协议方法
第四步:签订协议
第五步:指定代理人
第六步:实现协议方法
第一步:声明协议(值写入的.h)
@protocol SecondViewControllerNele gate
- (void)changeValue:(NSString *)text;
@optional //可选的协议方法
- (void)changeColor:(UIColor *)color;
@end
第二步:声明代理人(值写入的.h)
///第二个 controller 中的协议
@property (nonatomic, assign)idsecondViewControllerNe legate;
pop事件中
- (void)backButtonAction
{
第三步:执行相关的协议方法(值写入的.m)
[self.secondViewControllerNele
gate changeValue:self.textField.text];
[self.navigationController popViewControllerAnimate
d:YES];
}
第四步:签订协议(接收值的.m)
@interface RootViewController ()
- (void)pushNextController
{
SecondViewController *secondVC = [[SecondViewController alloc]init];
【****属性传值从前往后传值
(显示文本输入框的内容的文本
@property (strong, nonatomic)NSString *content;)(值写入的.h)
【就写在这个点击事件中】
需要把 label 的 text传给
secondVC.content = self.showTextLable.text;
(
在viewDidLoad中接收值
textField.text = self.content;
)】
第五步 指定代理人
secondVC.secondViewControllerNele
gate = self;//指定代理人
[self.navigationController pushViewController:secondVC animated:YES];
}
第六步 实现协议的方法(接收值的.m)
- (void)changeValue:(NSString *)text
{
self.showTextLable.text = text;
}
****model 传值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
取出下标
NSIndexPath *indexPath =
[self.tableView indexPathForSelectedRow];
storyboard 创建控制器
CellViewController *cell = [segue destinationViewControlle r];
将解析出来的值赋给接收方的 model (同一个 model,在两个类中声明属性以达到传值的作用)属性
cell.model = self.array1[indexPath.row];
// Get the new view controller using [segue destinationViewControlle
r].
// Pass the selected object to the new view controller.
}
Block的核心思想是 : 回调,Block作为属性进行传值的时候,一般使用场景是从第二个界面返回到上一个界面,基本步骤:
第一步:声明 Block 属性 参数名要带上,因为要参与运算(写入的.h 中声明)
@property (nonatomic, copy)void(^changeViewBlock)(NSString *string);
第二步:在跳转回接收值页面之前将要传递的内容给 block 属性
- (void)popButtonActioon
{
跳转会接收值页面
[self.navigationController popViewControllerAnimate
}
在接收值页面接收 block 传过来的值(在 push 过去之前接收)
- (void)pushButtonAction
{
第二种 block 传值
总结:Block 作为方法参数传值应用场景:一般是在处理数据的 Model进行使用;具体步骤:
typedef void(^AppDateSourceBlock)(NSString *string);
@interface AppDateSource : NSObject
- (void)sendMassage:(NSString *)string(这个地方写什么类型的就传什么类型的) andBlock:(AppDateSourceBlock)block;
@end
#warning 第三步:实现 Block 作为方法参数的那个方法
- (void)sendMassage:(NSString *)string andBlock:(AppDateSourceBlock)block
{
}
- (void)sendMassageAction
{
#warning 第四步:Block 回调,即实现 Block
}
协议传值(从后往前传)
@protocol SecondViewControllerNele
- (void)changeValue:(NSString *)text;
@optional //可选的协议方法
- (void)changeColor:(UIColor *)color;
@end
///第二个 controller 中的协议
@property (nonatomic, assign)idsecondViewControllerNe
pop事件中
- (void)backButtonAction
{
}
@interface RootViewController ()
- (void)pushNextController
{
【****属性传值从前往后传值
(显示文本输入框的内容的文本
@property (strong, nonatomic)NSString *content;)(值写入的.h)
【就写在这个点击事件中】
需要把 label 的 text传给
(
)】
}
- (void)changeValue:(NSString *)text
{
}
****model 传值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
storyboard 创建控制器
CellViewController *cell = [segue destinationViewControlle
将解析出来的值赋给接收方的 model (同一个 model,在两个类中声明属性以达到传值的作用)属性
}