標籤:ios delegate segue 傳值 protocol
之前在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; |
在工程中我是這麼做的:
@propertyid<SelectPeopleVCDelegate>delegate;
3.在ViewControllerB中,我們在將要從導航控制器中彈出該視圖的時候向代理髮送訊息(訊息中含有我們要傳遞的值)
NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; |
在實際工程中我是這樣完成的:
- (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]; |
在實際工程中我是這樣做的:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UIViewController * viewController = segue.destinationViewController;
BAGSelectPeopleVC * selectPeopleVC = (BAGSelectPeopleVC *)viewController;
selectPeopleVC.delegate =self;
}
iOS視圖控制器之間delegate傳值教程