IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容。在IOS开发里两个UIView窗口之间传递参数方法有很多,比如
1、使用SharedApplication,定义一个变量来传递.
2、使用文件,或者NSUserdefault来传递
3、通过一个单例的class来传递
4、通过Delegate来传递。
前面3种方法,暂且不说,这次主要学习如何使用通过Delegate的方法来在不同的UIView里传递数据
比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。
窗口1
窗口2
窗口2的结果传递给窗口1
1、首先定义个一委托UIViewPassValueDelegate用来传递值
- @protocol UIViewPassValueDelegate
- - (void)passValue:(NSString *)value;
- @end
这个protocol 就是用来传递值
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];
- }
第二个窗口的实现
.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;
- - (void)dealloc {
- [self.value release];
- [super dealloc];
- }
- - (IBAction)buttonClick:(id)sender
- {
- [delegate passValue:self.value.text];
- NSLog(@"self.value.text is%@", self.value.text);
- [self dismissModalViewControllerAnimated:YES];
- }
- - (void)didReceiveMemoryWarning {
- // Releases the view if it doesn't have a superview.
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc. that aren't in use.
- }
- - (void)viewDidUnload {
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
- }
- /*
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- - (void)drawRect:(CGRect)rect {
- // Drawing code.
- }
- */
- @end
委托,在我理解,是一个实现了某个 协议Protocol(相当于java中的接口)另一个对象的引用 一步一步说 1,另一个对象的引用 我们某一个对象常常需要调用其他对象的方法,属性等,所以会在自己的对象里面保留一个其他对象的引用 而跟委托相关的时候,你保留的引用是id类型,你不知道他是什么类,有什么类方法和属性 2,协议Protocol,相当于java中的接口,规定了一些特定的方法,凡是实现这个协议的类必须实现这个协议规定的方法。 而一个id refDelegate引用,你虽然不知道它是什么类,但是你知道他实现了某某协议,所以,你自己知道了他实现的方法 就写成了 id<协议名> refDelegate 3,然后你就可以去调用协议的方法 【refDelegate 协议规定的方法名】; 只要这个refDelegate 引用不是空的,它会直接定位到你赋值的具体的实现这个协议的类上面。 委托的好处:抽象事物的特征,把实现类和抽象类隔离,委托的作用是为了封装和分离 补充内容 (2011-12-11 23:57): 委托,我理解就是为了多态 |
源码下载:http://files.cnblogs.com/likwo/DelegateSample.zip