標籤:
之前在StackOverFlow上看到一篇講傳值(segue傳值和delegate傳值)的文章,感覺講的非常清晰,就將delegate部分翻譯了一下。有興趣能夠看看。
原文:
http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers
譯文:
為了從ViewControllerB往回傳值到ViewControllerA,我們須要使用協議(Protocols)和代理(Delegates)。
為了實現這個過程,我們須要設定ViewControllerA為ViewControllerB的代理。
這樣可以使ViewControllerB可以發送訊息到ViewControllerA,相同也能使我們將資料回傳。
ViewControllerA作為ViewControllerB的代理必需要遵從我們在ViewControllerB中定義的協議(Protocols),這可以告訴ViewControllerA有哪些方法是必需要實現的。
1.在ViewControllerB.h中,在#import和@interface之間(就是代碼位置)。我們像以下這樣定義我們的協議及協議方法:
@classViewControllerB;// Important @protocol ViewControllerBDelegate <NSObject> - (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item; @end |
註:(NSString *)item是我們如今要回傳的資料類型,也能夠是其它類型,如字典、數組等
2.仍然是在ViewControllerB.h中。設定一個delegate屬性,同一時候在ViewController.m中synthesize
@property (nonatomic, weak) id <ViewControllerBDelegate>delegate; |
在project中我是這麼做的:
@propertyid<SelectPeopleVCDelegate>delegate;
3.在ViewControllerB中,我們在將要從導航控制器中彈出該視圖的時候向代理髮送訊息(訊息中含有我們要傳遞的值)
NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; |
在實際project中我是這樣完畢的:
- (void)viewDidDisappear:(BOOL)animated
{
[self.delegateaddItemViewController:selfdidFinishSelectPeople:dataSourceArray];
}
註:dataSourceArray是我的資料來源,在一個公開變數,在前面的程式中完畢賦值。
4.以上就是全部要在ViewControllerB中進行的操作。接下來就是ViewControllerA的操作。
首先我們要在ViewControllerA.h中匯入ViewControllerB,並遵從它的協議:
#import "ViewControllerB.h" @interface ViewControllerA :UIViewController <ViewControllerBDelegate> |
5.在ViewControllerA.m中實現協議方法:
- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item { NSLog(@"This was returned from ViewControllerB %@",item); } |
6.最後,在我們將ViewControllerB壓入堆棧之前,我們須要告訴ViewControllerB,ViewControllerA是它的代理
(delegate):
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.delegate = self [[self navigationController] pushViewController:viewControllerB animated:YES]; |
在實際project中我是這樣做的:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UIViewController * viewController = segue.destinationViewController;
BAGSelectPeopleVC * selectPeopleVC = (BAGSelectPeopleVC *)viewController;
selectPeopleVC.delegate =self;
}
iOS視圖控制器之間delegate傳值教程