过程:有A和B控制器,A先跳转到B,然后B传值给A。
一、Block
1.首先在B控制器的.h文件中定义一个没有返回值,参数类型为NSString的block属性。
@property (copy, nonatomic)void(^block)(NSString *str);
2.在A控制器中,给B控制器的block属性进行赋值。
//A跳转B
- (void)push{
BViewController *vc = [[BViewController alloc]init];
vc.block = ^void(NSString *str){
//这里就可以拿到B控制器传递过来的值
NSLog(@"%@",str);
};
[self.navigationController pushViewController:vc animated:true];
}
3.在B控制器回跳到A的方法中调用block,调用block之前最好先判断block是否为空,不为空才调用,否则程序崩溃。
//B回跳A
- (void)pop{
//装逼写法
//!self.block? : self.block(@"回调");
//一般写法
if (self.block) {
self.block(@"回调");
}
[self.navigationController popViewControllerAnimated:YES];
}
二、Delegate
1.首先在B的.h文件中声明协议和协议方法。
@protocol BViewControllerDelegate <NSObject>
- (void)myDelegate:(NSString *)str;
@end
2.在B的.h中声明一个协议属性,这里要注意用assign或weak修饰,
weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。所以,似乎用weak更安全些。
@property (assign,nonatomic)id<BViewControllerDelegate>delegate;
3.在A的.m中,导入B控制器,实现B里的delegate,并实现delegate的方法。
#import "BViewController.h"
@interface AViewController ()<BViewControllerDelegate>
@end
//BViewControllerDelegate的方法
- (void)myDelegate:(NSString *)str{
//在这里拿到B传过来的值
NSLog(@"%@",str);
}
4.在A的.m中,在push到B界面的push方法之前,B对象的初始化之后,指定A对象为B对象的代理。
//A跳转B
- (void)push{
BViewController *vc = [[BViewController alloc]init];
vc.delegate = self;
[self.navigationController pushViewController:vc animated:true];
}
5.在B的.m中,在pop方法里,判断在指定的代理类中是否实现了该协议方法,[self.delegate 协议方法名称:(参数,也就是要传回的数据) ],确保执行时无此方法时不崩溃 。
//B回跳A
- (void)pop{
//装逼写法
// ![self.delegate respondsToSelector:@selector(myDelegate:)]? : [self.delegate myDelegate:@"回调"];
//一般写法
if ([self.delegate respondsToSelector:@selector(myDelegate:)]) {
[self.delegate myDelegate:@"回调"];
}
[self.navigationController popViewControllerAnimated:YES];
}
网友评论