要在view之间传数据大家都知道用delegate,我这里谈一下心得,适合新手。
网上一搜一大把的传递数据,但是都是单个数据,比如-(void)passValue:(NSString*)str;
这有个毛用,我们手机界面那个大,传一个数据有个锤子用啊?听说罗永浩在富士康附近宾馆住了半个月,问题还解决不了,你说你一个搞英语的,非要去搞手机,好歹雷军和比尔盖茨也是程序员,这下玩大了。
回过来讲,要传递批量数据咋办呐?一开始我想用C++思路,传结构体,多简单呐!结果ARC不允许在结构体放NSString之类的(初学的,勿笑)。问了cocoachina后原来可以自己定义类,呵呵。
原型参考这篇文章,说的正好是批量传递的:
http://blog.csdn.net/ryantang03/article/details/7915045
不过里面的代码比较老了,我们现在用的是纯粹storyboard,没有了如下代码:
//点击进入第二个窗口的方法
- (IBAction)openBtnClicked:(id)sender {
SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];
//设置第二个窗口中的delegate为第一个窗口的self
secondView.delegate = self;
[self.navigationController pushViewController:secondView animated:YES];
[secondView release];
}
取而代之的是prepareSegue,注意设置push的storyboard id
//在切换时此方法被调用,必须指定模态窗体的delegate为谁,否则模态窗体的delegate为nil
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"segIDLeftWin"]){
LeftBtnViewController *srcView =segue.destinationViewController;
srcView.delegate = self; //指定模态窗口的delegate
}
}
在切换到下一个view的时候调用prepareSegue,这样就可以提前指定delegate是谁,如果delegate按照上面那个网址定义的话,那编译器会报警告的,原因是类型不匹配。
总结一下:
1、新建一个h和m文件,专门定义数据结构类,注意类型要指定@property,m文件要指定@synthesize,这样才能像C语言一样用“点”来引用,OC是不是很强大?
2、可以把协议/代理也放到上面的h文件声明,这样对一个工程来说比较集中,各有所好
自定义delegate方法可以参考这里:http://blog.csdn.net/chengyingzhilian/article/details/7873365
3、修饰delegate的@property最好用id类型,否则容易引起编译器的类型不匹配警告:
@property (nonatomic,weak)id delegate;
4、在实现代理函数的类加入:
#pragma mark - dataPassGroupDelegate
同时要在h文件的类定义里加入<>表示使用这个delegate
附代码:传递数据类的h文件:
//定义一个多个数据的类,用来传递数据
@interface dataPassGroup : NSObject{
NSString *userName;
NSString *gender;
int age;
}
@property(nonatomic,strong) NSString *userName;
@property(nonatomic,strong) NSString *gender;
@property(assign)int age;
@end
传递数据类的m文件
#import "DataPassGroup.h"
@implementation dataPassGroup
//#synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用 点操作符 来方便的存取该成员变量
@synthesize userName,gender,age;
@end
被调用view的delegate定义(h文件):
//实现一个delegate
@protocol dataPassGroupDelegate
-(void)LeftWindowDidCancle;
-(void)LeftWindowDidDone:(dataPassGroup *)value;
@end
//本窗口的类实现
@interface LeftBtnViewController : UIViewController{
__weak IBOutlet UITextField *edtDataInput;
__weak IBOutlet UITextField *edtNameInput;
__weak IBOutlet UITextField *edtAgeInput;
dataPassGroup *values;
}
- (IBAction)onBtnLeftWinBackPress:(id)sender;
- (IBAction)onBtnLeftWinDonePress:(id)sender;
//还需要声明这个delegate
@property (nonatomic,weak) id delegate;
@end