### 一:两个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就不能调用,所以程序就会报编译错误。
- 前言
- (1) iphone开发,自定义Window-based Application 模板及委托运行机制
- (2) iphone 开发 表视图UITableView结构深层剖析
- (3) iphone 开发 从应用程序看UITableView的:分组,分区,索引,工作原理及其变换法则,plist文件数据定义规则
- (4) iphone 开发 自定义UITableViewCell的子类 ,轻松添加图片文本信息等
- (5) iphone 开发 在表视图(UITableView) 中利用UISearchBar实现数据的搜索,视图的多功能化
- (6) iphone 开发 真正理解委托(delegate)与数据源(data source)
- (7)---01 iphone 开发 数据传递 NSNotification 通知机制演示
- (7)---02 iphone 开发 数据传递 : 页面切换与数据的反向传递以及协议(protocol)作用的体现
- (8)---01 iphone 开发 大话分析导航栏NavigationController
- (9) iphone 开发 AppSettings , 系统setting与应用程序setting间的数据控制
- (10) iphone 开发 用户点击,触摸和手势识别 解析