標籤:ios app source code delegate 資料
在ViewController之間傳遞資料的方法有不少,博主這裡總結兩種最常用的方法給大家:
我們假設有 視圖控制器A 和 視圖控制器B,其中我們設視圖控制器B 是由 視圖控制器A通過Navigation controller Push過去的,也就是說視圖控制器B是視圖控制器A的子視圖控制器。
下面我們就分別通過 A->B 和 B->A傳遞資料說明兩種在視圖控制器之間傳遞資料的方法。
1.由視圖控制器A傳遞資料給視圖控制器B
- 這裡,我的視圖控制器A是 ViewController 視圖控制器B是CheckViewController。在Storyboard上面串連視圖控制器A和視圖控制器B,點擊連線,在屬性設定視窗設定 segueidentifier. 這裡我們將其設定為 MainToCheck.
- 在CheckViewController.h檔案中定義屬性_showArray用於接收資料
@property (strong, nonatomic) NSArray *showArray;
- 在ViewController.m檔案中設定- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([[segue identifier] isEqualToString:@"MainToCheck"]) { CheckViewController *CheckVC = [segue destinationViewController]; CheckVC.showArray = [[NSArray alloc] initWithArray:_currentArray]; }}
這樣就完成了A->B的資料傳遞
2.由視圖控制器B傳遞資料給視圖控制器A
從子視圖控制器向父視圖控制器傳遞資料無法利用segue。通常的做法是利用protocol做一個監聽器。具體方法如下:
- 在CheckViewController.h中添加協議(注意添加的位置是在#import和#interface之間):
@class LoadViewController;@protocol CheckViewDelegate <NSObject>-(void)LoadDataViewController:(CheckViewController *)controller didFinishLoadData:(NSMutableArray *)loadedArray;@end
- 在CheckViewController.h中添加屬性 delegate作為監聽器。
@property (nonatomic, weak) id <LoadViewDelegate> delegate;
- 在CheckViewController.m中調用該方法。
[self.delegate LoadDataViewController:self didFinishLoadData:testArray];
- 在ViewController.h檔案中添加協議。
- 在Push出CheckViewController執行個體時添加設定監聽器
CheckVC.delegate = self;
- 在ViewController.m檔案中實現第三步中的方法。
-(void)LoadDataViewController:(CheckViewController *)controller didFinishLoadData:(NSMutableArray *)loadedArray{ self.currentArray = loadedArray;}
這樣就完成了B->A的資料傳遞。相對複雜一些。
在ViewController之間傳遞資料的方法【iOS】