(7)---02 iphone 开发 数据传递 : 页面切换与数据的反向传递以及协议(protocol)作用的体现

一:两个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.
}


运行结果:



小结:

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就不能调用,所以程序就会报编译错误。

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值