本人原创,转载请注明出处:
http://iphone.xiaoxiaostudio.net 如何在ViewController之间传值,我想这是很多刚开始学习iPhone编程朋友,经常问题的一个问题。我就来总结一下吧。
一、前向传值
可以通过属性的方法来实现。举例说明,两个 ViewControllerA 和 ViewControllerB,向ViewControllerB对象传递一个BOOL值数值。 那么在ViewControllerB里添加属性
@property(nonatomic) BOOL *isSomethingEnabled;
然后在ViewControllerA中调用时,传递这个属性
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib=@"ViewControllerB" bundle=nil];
viewControllerB.isSomethingEnabled = YES;
[self.navigationController pushViewController:viewControllerB animated:YES];
二、后向传值(回传值)
通过委托来实现。 1.在ViewControllerB中定义一个委托
@protocol ViewControllerBDelegate <NSObject>
- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
@end
2.为ViewControllerB添加属性
@property (nonatomic, weak) id <ViewControllerBDelegate> delegate;
3.在需要传值给ViewControllerA的地方调用delegate的方法,其实,就是将事件将由delegate指定的对象来实现。
例如:ViewControllerB里面有一个按钮点击
-(void) buttonClick:(id)sender
{
NSString *itemToPassBack = @"Pass this value back to ViewControllerA";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
}
4.在ViewControllerA里实现该委托的方法
#import "ViewControllerB.h"
@interface ViewControllerA : UIViewController <ViewControllerBDelegate>
- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item
{
NSLog(@"This was returned from ViewControllerB %@",item);
}
5.在生成ViewControllerB的对象时,指明该对象的Delegate是由谁来完成,这里是由ViewControllerA来实现的。
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib=@"ViewControllerB" bundle=nil];
viewControllerB.delegate = self
[[self navigationController] pushViewController:viewControllerB animated:YES];
这样就完成了两边的交互了。