第一种:delegate
若有A·B界面,A跳转到B,B返回A并将所需的值传给A(不能盲目的复制,你的先写出A跳转到B的代码,然后再按下面的步骤写)
例:B.h文件下面写
#import <UIKit/UIKit.h>
@protocol LookTaskCtrlDelegate <NSObject>
- (void)lookTaskCtrlWithMember:(NSarray *)ary;
@end
@interface LookTaskCtrl : UIViewController
@property (nonatomic,assign) id<LookTaskCtrlDelegate> delegate;
@end
B.m文件中传我们想要的数据
NSarray = @[@"1111",@"2222",@"33333"];
[self.delegate lookTaskCtrlWithMember:lookMemberArry];
B文件的工作就结束了,现在传值回A文件了
A.m
@interface UIViewController()<LookTaskCtrlDelegate>
#pragma mark LookTaskCtrlWithMemberDelegate
- (void)lookTaskCtrlWithMember:(NSMutableArray *)ary{
NSLog(@"ary = %@",ary);
}
B界面里定义的数组就回到A界面啦~~~
第二种:Block
Block,有点难理解,多写个3遍就会发现有点味道了.知道是个怎么回事.
例:同样在B文件里,定义一个带Block的方法
#import <UIKit/UIKit.h>
typedef void(^GradeValueStr)(NSString *string);
@interface TaskGradeCtrl : UIViewController
- (void)returnGradeStrWithBlock:(GradeValueStr) block;
@end
在B.m文件里
@implementation TaskGradeCtrl{
GradeValueStr gradeblock;
}
在这里面又定义一个,会发现奇怪,其实和前面的什么关系,他也是一个Block,只是方便赋值而已.因为两个方法调用同一个值需要定义一个全局的.
- (void)returnGradeStrWithBlock:(GradeValueStr) block{
gradeblock = block;//这个时候block就等于gradeblock了,gradeblock是从别的方法里得到的.你会郁闷,这个方法不会运行啊.
其实就是将这个方法放到A.h文件里去执行,block的数据是不是也到A.m文件里去了呢
}
然后回到A.m文件中,那个地方实例B,方法就放那去执行吧
TaskGradeCtrl *taskGradeVC = [[TaskGradeCtrl alloc] init];
[taskGradeVC returnGradeStrWithBlock:^(NSString *grade){
NSlog(@"grade = %@",grade);
}];
[self.navigationController pushViewController:taskGradeVC animated:YES];
这样Block方法也就完成了回调了
第三种方法:viewWillAppear: 视图即将可见时调用。默认情况下不执行任何操作
例:
- (void)viewWillAppear:(BOOL)animated{
if (!B.ary){
[createListTab reloadData];
return;
}
[chargeAry setArray:B.ary];
NSLog(@"chargeAry = %@",chargeAry);
[createListTab reloadData];
}
这段代码的意思是如果B.ary这个数据不为空,就赋值,由于当我们跳转到B的时候就alloc了,如果B中附了值.那么返回A的时候值也被回调了.
这样就完成3种回调啦~~~,想想今天看了别人用MVC的代码,转的我头都晕乎的,今后也要用这种方式写,虽然基本原理都懂,但是我还是没看懂那代码,要是有哪位大神能给个通熟易懂好学习的代码就感激不敬啦.
原文:http://www.cnblogs.com/lizongkai/p/5087034.html