多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 一:两个view之间的数据相互传递。 ### 1)这里两个view间切换主要用到的是每个类对象固有的属性(modalTransitionStyle)来设置过渡模式(也就是过渡(切换)到别的界面)。 ### 2)还会用到委托(delegate)来响应事件方法。 ### 3)要特别注意协议delegate: ~~~ @protocol delegate <NSObject> -(void)myupdata:(NSString *)str; @end ~~~ 在此程序中的作用:是从视图2(MyModalTransition (定义一个id 类型遵循上诉协议的属性:mydelegate  。mydalegate会得到视图1类,从而调用其实现的方法。))返回到视图1(MyObserver(遵循上诉协议实现其myupdata方法))的重要渠道。 ### 二:新建程序: 第一个view MyObserver.h ~~~ #import <UIKit/UIKit.h> #import "MyClass.h" #import "MyModalTransition.h" @interface MyObserver : UIViewController <delegate> { UITextField *mytext01; } @property(retain) MyClass *myclass; //定义另一个类MyModalTransition的属性 @property(nonatomic,retain) MyModalTransition *mymtra; @property (nonatomic, strong) IBOutlet UITextField *mytext01; -(void)myupdata:(NSString*) str;- (IBAction)btnpress:(id)sender; -(void)exit; -(IBAction)anytouchback:(id)sender; @end ~~~ MyObserver.m ~~~ #import "MyObserver.h" @implementation MyObserver @synthesize mytext01; @synthesize mymtra; - (void)viewDidLoad { //点击屏幕键盘的return键时,键盘响应exit方法,放弃第一响应者退出 [self.mytext01 addTarget:self action:@selector(exit) forControlEvents:UIControlEventEditingDidEndOnExit]; [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } -(void)myupdata:(NSString *)str{ self.mytext01.text=str; //放弃过渡模式,开始开始显示第一个view [self dismissModalViewControllerAnimated:YES]; } - (IBAction)btnpress:(id)sender { self.mymtra=[[MyModalTransition alloc] init]; //定义模型过渡样式 mymtra.modalTransitionStyle=UIModalTransitionStylePartialCurl; //mymtra.modalTransitionStyle=UIModalTransitionStyleCoverVertical; //数据传递 mymtra.message=self.mytext01.text; //把当前类self传给另一个视图的委托 mymtra.mydelegate=self; //呈现模型 [self presentModalViewController:mymtra animated:YES]; } //点击键盘的return键,执行此方法,键盘退出 -(void)exit{ //放弃第一响应者身份 [self resignFirstResponder]; } //点击键盘空白处将执行此方法键盘退出,最重要的一点就是次视图控制器类必须继承自UIControl,才能与其Touch Down相连,触发执行此方法。 -(IBAction)anytouchback:(id)sender{ [ mytext01 resignFristResponder]; } ~~~ 第二个view MyModalTransition.h ~~~ #import <UIKit/UIKit.h> //在这定义协议的原因是:这样mydelegate属性遵循协议的时候本身就有了myupdata方法,其实现部分就是在上一个视图MyObserver里。当mydelegate获得MyObserver时就可以调用这个方法了。 @protocol delegate <NSObject> -(void)myupdata:(NSString *)str; @end @interface MyModalTransition : UIViewController { UITextField *mytext02; } //遵循delegate协议就拥有了其myupdata方法 @property(assign) id <delegate>mydelegate; @property (nonatomic, strong) IBOutlet UITextField *mytext02; @property(copy) NSString *message; - (IBAction)btnbackpress:(id)sender; @end ~~~ MyModalTransition.m ~~~ #import "MyModalTransition.h" @implementation MyModalTransition @synthesize mytext02; @synthesize mydelegate; @synthesize message; //点击按钮 - (IBAction)btnbackpress:(id)sender { NSString *str=mytext02.text; //值传递 [self.mydelegate myupdata:str]; } #pragma mark - View lifecycle - (void)viewDidLoad { self.mytext02.text=message; [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } ~~~ ![](https://box.kancloud.cn/2016-06-12_575cce7fd9866.png) ### 运行结果: ![](https://box.kancloud.cn/2016-06-12_575cce80089a0.gif) 小结: 1.到这里可能会有个疑问,就是传递数据时为什么另外定义一个message 而不直接使用视图2里的textfield属性。原因就是当程序开始运行时展示的是视图1,视图1里直接用视图2的对象去调用视图2的属性,是不行的。因为这时textfield虽然随着nib文件的加载而被实例化,然而还没有被解冻,不能使用,只有当视图2的视图呈现时才被解冻,可以使用。 2.另外一个疑问就是这里定义的delegate协议:试想一下,如果没有定义协议delegate,只是在视图1里定义了myupdata方法,而视图2 里的属性mydelegate得到视图1类去调用这个方法,这看起来合情合理。但,这样写程序会报错的,原因就是程序分为编译时和运行时两个状态,当编译视图2的[self.mydelegate myupdata:str];这段代码时会报错,因为这时mydelegate还没有得到第视图1类,而现在视图2里是没有名为myupdata的方法的,mydelegate就不能调用,所以程序就会报编译错误。