成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS開發之協議:代理傳值

移動開發 iOS
剛開始做iOS開發的時候,對 protocol、delegate 的理解一直都是暈暈乎乎一知半解的狀態,不知道兩UIViewController之間怎么進行傳值。現在時間久了就寫出來幫助新手們學習與理解,并提供了源碼下載。

剛開始做iOS開發的時候,對 protocol、delegate 的理解一直都是暈暈乎乎一知半解的狀態,不知道兩個UIViewController之間怎么進行傳值。

面試過幾個童鞋,問道怎么用 delegate 對兩個UIViewController 進行傳值的時候,回答的都是模棱兩可的。今天又有童鞋問我這個問題,所以干脆寫個blog說明一下。

1、協議(protocol),就是使用了這個協議后,必須按照協議規定的內容來處理事情,協議中要求的方法必須實現(@optional的方法除外)。

protocol是一種語法,它提供了一個很方便的、實現delegate模式的機會。

定義protocol如下:

  1. @protocol ClassBDelegate<NSObject> 
  2. - (void)methodOne; 
  3. @optional 
  4. - (void)methodTwo:(NSString *)value; 
  5. @end

定義了一個ClassB的協議,這個協議中包含兩個方法,其中methodTwo為可選的。

在ClassA的頭文件(ClassA.h)中實現這個協議,如下代碼:

  1. @interface ClassA<ClassBDelegate> 
  2. @end

在ClassA的實現文件(ClassA.m)中實現ClassBDelegate的兩個方法,其中methodTwo可以不實現,如下:

  1. - (void)methodOne{ 
  2.     // 具體實現內容 
  3.  
  4. - (void)methodTwo:(NSString *)value{  
  5.     // 具體實現內容   
  6. }

2、代理(delegate),顧名思義就是委托別人辦事,當一件事情發生后,自己不處理,讓別人來處理。

delegate和protocol沒有關系。delegate本身是一種設計模式。是把一個類自己需要做的一部分事情,讓另一個類(也可以就是自己本身)來完成。

在ClassB的頭文件(ClassB.h)中定義一個代理如下:

  1. @interface ClassB 
  2. @property (nonatomic, unsafe_unretained) id<ClassBDelegate> delegate; 
  3. @end

這樣,當我們在ClassB的實現文件(ClassB.m)中遇到想讓別的類(如 ClassA)處理的問題時,就可以這樣

  1. [self.delegate methodOne]; 
  2. [self.delegate methodTwo:@"需要傳遞的值"]; 

3、上邊簡單的介紹了一下協議與代理,現在開始講兩個UIViewController之間怎么進行傳值的事例。

首先啟動Xcode,從菜單選擇file-New Project...,彈出如下窗口:

選擇Single View Application,然后點擊 Next,彈出如下窗口:

a、給工程取個名稱為 DelegateByValue;

b、下邊的組織名稱寫自己所在的組織,這里寫的是我個人的名稱;

c、公司標識分為兩部分,com也就是Company(公司)的意思,iostour寫自己所在的公司名稱,這里我寫的是iOS之旅的iostour;

d、類前綴,這個可以隨便,不過我這里寫的是W,因為我姓衛,所以取其首字母,這樣公司同事一看到這個類就知道是我寫的;

e、設備選擇iPhone;

f、我們用xib的方式編寫,故此處不勾選;

g、使用ARC機制,勾選;

h、該事例不做單元測試,不勾選。

然后單擊 Next,彈出如下窗口:

選擇一個存儲工程的目錄,然后單擊 Create創建一個工程,創建完成后的目錄結構如下:

接下來我們需要在兩個Controller之間進行傳值,由于創建工程的時候已經自動為我們生成了一個WViewController,所以我們只需要在創建一個就Controller就好啦。

鼠標右鍵DelegateByValue,點擊New File...  如下:

然后彈出如下窗口

選擇iOS>Cocoa Touch >Objective-C Class,然后單擊 Next,彈出如下窗口:

然后,取名為WTwoViewController,單擊 Next,選擇存儲目錄,然后Create。

接下來為WTowViewController 創建一個.xib文件,步驟以此如下:

a、鼠標右鍵DelegateByValue,點擊New File...

b、然后彈出如下窗口:

這次我們選擇iOS > User Interface > View,單擊 Next,取名為WTwoViewController,然后Create。

創建好WTwoViewController后,我們讓WTwoViewController.xib與WTwoViewController.h關聯起來,如下圖:

按照上圖1、2、3的步驟依次進行,選中1,點擊2,設置3 Class為WTwoViewController,然后回車,然后如下圖:

點擊4、按住5 view后邊的空心圓,拖動到6 view上,然后松手及

接下來給view上拖一個UITextField和一個UIButton,并給UITextField起名為txtValue,給UIButton設置一個Action,起名為pressChange

步驟如下:

1、分屏顯示xib與代碼,

2、選擇UITextField,并按住control鍵, 拖動到右側的代碼(WTwoViewController.h)區域,會彈出如下窗口:

為其設置名稱,然后點擊Connect;

3、同樣,選擇UIButton,并按住control鍵,拖動到右側代碼(WTwoViewController.h)區域,會彈出如下窗口:

這次因為是要給UIButton設置點擊事件,所以改變1 Connection為Action,然后設置名稱,點擊Connect。

至此WTwoViewController的窗口視圖以設置完成。

同樣步驟設置WViewController.xib窗口。

給 view 上拖一個UILabel和一個UIButton,并給UILabel起名為lblValue,給UIButton設置一個Action,起名為pressCasting。

至此窗口設置部分已經全部完成。

接下來在WTwoViewController.h中定義一個協議,WTwoViewControllerDelegate,并給WTwoViewController定義一個代理,代碼如下:

  1. // 
  2. //  WTwoViewController.h 
  3. //  DelegateByValue 
  4. // 
  5. //  Created by wzrong on 13-7-20. 
  6. //  Copyright (c) 2013年 wzrong. All rights reserved. 
  7. // 
  8. #import <UIKit/UIKit.h> 
  9. @protocol WTwoViewControllerDelegate <NSObject> 
  10. - (void)changeValue:(NSString *)value; 
  11. @end 
  12. @interface WTwoViewController : UIViewController 
  13. @property (nonatomic, unsafe_unretained) id<WTwoViewControllerDelegate> delegate; 
  14. @property (nonatomic, strong) IBOutlet UITextField *txtValue; 
  15. - (IBAction)pressChange:(id)sender; 
  16. @end 

接下來在WTwoViewController.m中的 - (IBAction)pressChange:(id)sender 方法中把代理派發出去,順便把窗口給銷毀,代碼如下:

  1. - (IBAction)pressChange:(id)sender { 
  2.     [self.delegate changeValue:self.txtValue.text]; 
  3.     [self dismissViewControllerAnimated:YES completion:nil]; 

WTwoViewController中的設置已經完成,接下要在WViewController中調用WTwoViewController,并實現WTwoViewControllerDelegate代碼。

首先在WViewController.h中實現代理,代碼如下:

  1. // 
  2. //  WViewController.h 
  3. //  DelegateByValue 
  4. // 
  5. //  Created by wzrong on 13-7-20. 
  6. //  Copyright (c) 2013年 wzrong. All rights reserved. 
  7. // 
  8. #import <UIKit/UIKit.h> 
  9. #import "WTwoViewController.h" 
  10. @interface WViewController : UIViewController<WTwoViewControllerDelegate> 
  11. @property (strong, nonatomic) IBOutlet UILabel *lblValue; 
  12. - (IBAction)pressCasting:(id)sender; 
  13. @end 

其在WViewController.m的 - (IBAction)pressCasting:(id)sender 方法中調用WTwoViewController,并設置代理的回調方法,代碼如下:

  1. - (IBAction)pressCasting:(id)sender { 
  2.     WTwoViewController *controller = [[WTwoViewController alloc]initWithNibName:@"WTwoViewController" bundle:nil]; 
  3.     controller.delegate = self; 
  4.     [self presentViewController:controller animated:YES completion:nil]; 
  5.  
  6. - (void)changeValue:(NSString *)value{ 
  7.     // 改變UILabel的值 
  8.     self.lblValue.text = value; 

OK,搞定。

這里只實現了從WTwoViewController到WViewController的傳值,大家可以自己做做從WViewController到WTwoViewController的傳值。

工程源碼傳送門DelegateByValue

責任編輯:閆佳明 來源: cnblogs
相關推薦

2012-05-14 21:14:07

Android頁面傳值

2017-12-25 14:59:47

APP架構iOS協議

2013-07-22 14:33:15

iOS開發ASIHTTPRequ

2011-05-19 17:49:08

ActivityAndroid開發

2014-07-21 14:49:35

iOSUILabel

2014-07-23 13:17:53

iOSUITextField

2017-02-15 09:25:36

iOS開發MQTT

2011-08-02 11:07:42

iOS開發 UIWebView

2011-08-11 16:50:04

iOSTwitter

2013-07-09 14:36:24

2014-10-22 09:36:41

TCPIP

2011-04-06 11:41:25

Java動態代理

2014-08-08 10:12:44

IRC

2013-07-25 15:15:26

iOS開發學習iOS全局變量

2013-07-25 15:19:23

iOS開發學習Xcode打包framiOS開發

2013-04-11 16:08:50

iOS開發技巧積累

2013-07-29 04:51:41

iOS開發iOS開發學習file列表查看

2014-06-13 13:47:31

UDP

2010-06-12 18:00:16

ARP協議

2010-06-28 15:28:27

SNMP協議代理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级视频在线观看 | 国产精品久久久久久久久久久久 | 欧美一区二区三区在线播放 | 久久久久久a| 黄色亚洲| 激情五月综合 | 国产精品久久久久久久一区二区 | 久久久一二三区 | 欧美日韩精品国产 | 人人干人人干人人 | 日韩www视频 | 亚洲成人久久久 | 亚洲国产视频一区二区 | 欧美激情综合 | 精品国产99 | 精品91久久久 | 日日操av| 国产精品毛片一区二区在线看 | 99热碰 | 日本韩国电影免费观看 | 少妇一区二区三区 | 色一情一乱一伦一区二区三区 | 国产亚洲欧美日韩精品一区二区三区 | 国产精品久久久久久久久久久免费看 | 亚洲一区自拍 | 国产aa | 亚洲天堂999| 日本精品久久 | 久久精品小视频 | 日韩欧美大片在线观看 | 国产在线高清 | 久久精品国产一区 | 成人免费在线视频 | 日韩欧美在线观看视频网站 | www.青娱乐| 免费看av大片 | 精品视频999 | 产真a观专区 | 国产精品亚洲片在线播放 | 国产一区二区三区网站 | 国产一区二区三区四区三区四 |