iOS ViewController之间传递数据
翻译自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];
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。