iOS开发中遇到的数据交互问题很多,其中最经典的就是在viewA
处理完的数据显示到viewB
中。实现这个功能有很多种方法。
NSNotificationCenter传递数据
把ViewA的数据传给ViewB
// 在ViewA中代码
[[NSNotificationCenter defaultCenter] postNotificationName:@"name" object:data];
创建一个通知,通知名字为name
,objcet
就是你要传输的数据。
// ViewB中代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(show:) name:@"name" object:nil];
ViewB中接收名字为name
的通知并实现show
方法
- (void)show:(NSNotification *)notifaction {
NSString *name = notifaction.object;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
在show
方法中创建一个NSString
对象把传过来的数据装起来notifaction.object
就是ViewA中传递的data
数据。
注意:用完通知记得remove,不然会出错。
使用委托delegate传递数据
1.首先定义个一委托UIViewPassValueDelegate用来传递值
@protocol UIViewPassValueDelegate
- (void)passValue:(NSString *)value; // 这个protocol 就是用来传递值
@end
2.在窗口1的头文件里,声明delegate并实现数据传递方法
#import <UIKit/UIKit.h>
#import "UIViewPassValueDelegate.h"
@interface DelegateSampleViewController : UIViewController <UIViewPassValueDelegate>
{
UITextField *_value;
}
@property(nonatomic, retain) IBOutlet UITextField *value;
- (IBAction)buttonClick:(id)sender;
@end
// 实现委托
- (void)passValue:(NSString *)value
{
self.value.text = value;
NSLog(@"the get value is %@", value);
}
// button的Click方法,打开窗口2,并将窗口2的delegate实现方法指向窗口1
- (IBAction)buttonClick:(id)sender
{
ValueInputView *valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView" bundle:[NSBundle mainBundle]];
valueView.delegate = self;
[self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentModalViewController:valueView animated:YES];
}
3.第二个窗口的实现
// .h文件
#import <UIKit/UIKit.h>
#import "UIViewPassValueDelegate.h"
@interface ValueInputView : UIViewController {
NSObject<UIViewPassValueDelegate> * delegate;
UITextField *_value;
}
@property(nonatomic, retain)IBOutlet UITextField *value;
@property(nonatomic, retain) NSObject<UIViewPassValueDelegate> * delegate;
- (IBAction)buttonClick:(id)sender;
@end
// .m文件
#import "ValueInputView.h"
@implementation ValueInputView
@synthesize delegate;
@synthesize value = _value;
- (IBAction)buttonClick:(id)sender
{
[delegate passValue:self.value.text];
NSLog(@"self.value.text is%@", self.value.text);
[self dismissModalViewControllerAnimated:YES];
}
@end