1. 程式人生 > >ios delegate代理,多個/不同/兩個view之間傳遞資料,傳遞批量資料,多個數據

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