翻譯自stackoverflow的問題
前向傳遞數據:
例如你有ViewControllerA和ViewControllerB,從ViewcontrollerA向ViewcontrollerB傳遞一個BOOL變量:
(1)在ViewControllerB.h創建一個屬性
@property (nonatomic, assign) BOOL *isSomethingEnabled;
(2)在ViewcontrollerA中引入頭文件
#import "ViewControllerB.h"
當點擊didSelectRowAtIndex或者IBAction的時候可以用以下代碼設置ViewControllerB的屬性
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.isSomethingEnabled = YES; [self pushViewController:viewControllerB animated:YES];
用Segue前向傳遞數據:
用以下方法傳遞數據:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
(1)在ViewControllerB.h創建一個屬性
@property (nonatomic, assign) BOOL *isSomethingEnabled;
(2)在ViewcontrollerA中引入頭文件
#import "ViewControllerB.h"
(3)建立一個從ViewControllerA到ViewControllerB的segue,不妨取名為showDetailSegue
(4)實現方法:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"showDetailSegue"]){ ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController; controller.isSomethingEnabled = YES; } }
如果你的view是嵌套在navigation controller里
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"showDetailSegue"]){ UINavigationController *navController = (UINavigationController *)segue.destinationViewController; ViewControllerB *controller = (ViewControllerB *)navController.topViewController; controller.isSomethingEnabled = YES; } }
后向傳遞數據:
ViewControllerA里面點擊某些按鈕,跳轉到ViewControllerB,里面的事件執行完成后,又要跳轉回ViewControllerA,並且把一些數據傳遞回ViewControllerA。這里需要用到代理模式。
(1)在ViewControllerB.h中,#import下,@interface上聲明一個協議
@protocol ViewControllerBDelegate <NSObject> - (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item; @end
(2)在ViewControllerB.h設置一個delegate屬性
@property (nonatomic, weak) id <ViewControllerBDelegate> delegate;
(3)在ViewControllerB中,當我們退出這個ViewController的時候
NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
(4)在ViewControllerA.h中,引入頭文件並實現協議
#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 = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.delegate = self [[self navigationController] pushViewController:viewControllerB animated:YES];