ios delegate代理,多個/不同/兩個view之間傳遞資料,傳遞批量資料,多個數據
要在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