### 一:兩個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就不能調用,所以程序就會報編譯錯誤。
- 前言
- (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 開發 用戶點擊,觸摸和手勢識別 解析