iOS開發-Protocol協議及委托代理(Delegate)傳值

前言:因為Object-C是不支持多繼承的,所以很多時候都是用Protocol(協議)來代替。Protocol(協議)只能定義公用的一套接口,但不能提供具體的實現方法。也就是說,它只告訴你要做什么,但具體怎么做,它不關心。

當 一個類要使用某一個Protocol(協議)時,都必須要遵守協議。比如有些必要實現的方法,你沒有去實現,那么編譯器就會報警告,來提醒你沒有遵守×× 協議。注意,我這里說的是警告,而不是錯誤。對的,就算你不實現那些“必要實現”的方法,程序也是能運行的,只不過多了些警告。

我會在本文的結尾放上此Demo的下載地址,有需要的話可以去下載,謝謝。

Protocol(協議)的作用:

1. 定義一套公用的接口(Public)

  • @required:必須實現的方法

  • @optional:可選?實現的方法(可以全部都不實現)

2. 委托代理(Delegate)傳值:

它本身是一個設計模式,它的意思是委托別人去做某事。?

比如:兩個類之間的傳值,類A調用類B的方法,類B在執行過程中遇到問題通知類A,這時候我們需要用到代理(Delegate)。

又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉到C2,再從C2返回到C1時需要通知C1更新UI或者是做其它的事情,這時候我們就用到了代理(Delegate)傳值。

一、定義一套公用的接口(Public)

首先新建一個協議文件:

nEV77j.png

填上協議文件名及文件類型(選擇Protocol):

NnmAFfv.png

ProtocolDelegate.h代碼(協議不會生成.m文件):

#import?@protocol?ProtocolDelegate?//?必須實現的方法
@required
-?(void)error;//?可選實現的方法
@optional
-?(void)other;
-?(void)other2;
-?(void)other3;@end

在需要使用到協議的類,import它的頭文件:

#import?"ViewController.h"
#import?"ProtocolDelegate.h"

我這里選擇的是入口文件

記得要遵守協議:

@interface?ViewController?()?@end

這時會報一個警告,因為定義的協議里有一個是必須實現的方法,而我們沒有去實現:

vEVJZr.png

實現了必須實現的方法后,編譯器就不會報警告了:

JRrA32.png

至于其它的可選方法,你可以選擇實現,也可以全都不實現。

二、委托代理(Delegate)傳值

在Storyboard上,先搭好界面,如下圖:

yYRZju.png

新建ControllerB:

bmUnmeQ.png

把B界面的類設置為ViewControllerB:

R367Zn.png

下面放出主要類文件代碼,我在里面寫了注釋,大家應該能看懂。不懂也沒有關系,我會在本文結尾放上Demo下載地址。

ViewController.m文件:

#import?"ViewController.h"
#import?"ProtocolDelegate.h"
#import?"ViewControllerB.h"
@interface?ViewController?()?@end
@implementation?ViewController
-?(void)prepareForSegue:(UIStoryboardSegue?*)segue?sender:(id)sender
{ViewControllerB?*vc?=?segue.destinationViewController;[vc?setDelegate:self];
}
//?這里實現B控制器的協議方法
-?(void)sendValue:(NSString?*)value
{UIAlertView?*alertView?=?[[UIAlertView?alloc]?initWithTitle:@"成功"?message:value?delegate:nil?cancelButtonTitle:@"確定"?otherButtonTitles:nil,?nil];[alertView?show];
}
-?(void)error
{
}
@end

ViewControllerB.h文件:

#import?//?新建一個協議,協議的名字一般是由“類名+Delegate”
@protocol?ViewControllerBDelegate?//?代理傳值方法
-?(void)sendValue:(NSString?*)value;@end@interface?ViewControllerB?:?UIViewController//?委托代理人,代理一般需使用弱引用(weak)
@property?(weak,?nonatomic)?id?delegate;@end

ViewControllerB.m文件:

#import?"ViewControllerB.h"
@interface?ViewControllerB?()
@property?(strong,?nonatomic)?IBOutlet?UITextField?*textField;
@end
@implementation?ViewControllerB
-?(IBAction)backAction:(id)sender
{if?([_delegate?respondsToSelector:@selector(sendValue:)])?{?//?如果協議響應了sendValue:方法[_delegate?sendValue:_textField.text];?//?通知執行協議方法}[self.navigationController?popViewControllerAnimated:YES];
}
@end

完成效果截圖:

IFVv2i.png

小結:

當你需要定義一套公用的接口,實現方法可以是不同的時候,你可以使用Protocol協議。

當你需要進行類與類之間的傳值時,你也可以基于Protocol協議,使用代理設計模式進行傳值。

Demo測試通過環境:

  • 開發工具:Xcode6.1

  • 測試機型:模擬器

  • 測試系統:IOS8.0

Demo下載地址:?GCProtocol&Delegate

轉載于:https://www.cnblogs.com/Free-Thinker/p/4973155.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397239.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 查看分支編碼_12個常用的Git命令,趕緊記一波!

今天齊姐簡單講下 Git 的實現原理,知其所以然才能知其然;并且梳理了日常最常用的 12 個命令,分為三大類分享給你。本文的結構如下:作者和開發原由Git 的數據模型常用命令資源推薦作者和開發原由Talk is cheap. Show me the code.這…

在域環境下搭建samba服務器

環境:samba:smbserver: 192.168.0.18AD:rise.com:192.168.0.37組:zixun xingzheng teacher class admin共享目錄:zixun xingzheng xueshu other一.安裝Samba服務器yum install -y samba二.把linux加入到ad中1.先…

Android NDK編程,引入第三方.so庫

android自帶的編譯工具NDK進行編譯時(非單純的調用第三方.so而是進行ndk編程),armeabi以及armeabi-v7a文件夾下的第三方so文件將會被刪除,只會產生編譯后的so文件,其他的so文件將無法引入,現在我們就來解決&#xff1a…

會做飯的機器人曰記_顏真卿《麻姑仙壇記》:蒼勁古樸,體態沉雄,氣象宏大...

《麻姑仙壇記》,全稱《有唐撫州南城縣麻姑山仙壇記》,或稱《麻姑山仙壇記》。顏真卿撰并書于大歷六年(771)四月。此碑有大、中、小三種刻本,且原石均佚,原拓佳本亦難得。大字本,字徑約5厘米&…

IBM服務器硬盤出現Other Error可能原因

除了確實物理等因素外,可能還因為:Other Errors的 很有可能也是固件(firmware)版本太低造成。 固件版本太低的話,硬盤自身有power safe模式,在硬盤長時間沒有I/O情況下,硬盤會自動斷電,而系統本身誤以為是硬…

怪異模式

眾所周知,HTML文檔結構可分為:文檔聲明<!DOCTYPE HTML>、HTML元素&#xff08;根元素/根標記/根標簽/祖先元素&#xff09;、head元素、body元素。 文檔聲明是用來通知瀏覽器&#xff0c;目前的文檔正使用哪個HTML版本&#xff0c;如果我們不寫文檔聲明<!DCOTYPE HTML…

Metro UI 菜單(Winform)

我有個項目需要要到菜單導航&#xff0c;就自己動作做了一個&#xff0c;感覺還可以&#xff0c;分享給大家。下載地址:http://files.cnblogs.com/files/dyj057/MetroUIMenu.zip 主要代碼&#xff1a; private void SetElements(){if (Elements null) return;int eWidth Bord…

echarts 山東地圖_用Python畫中國地圖,實現各省份數據可視化

第一步&#xff1a;安裝pyechartspyecharts是一款將python與echarts結合的強大的數據可視化工具&#xff0c;本文使用了0.1.9.4版本pip install pyecharts0.1.9.4第二步&#xff1a;讀取數據我的數據是在Excel表格里&#xff0c;如下圖&#xff1a;Execel數據使用xlrd(沒有就通…

mysql 中某個字段相同的數據拼接起來

2019獨角獸企業重金招聘Python工程師標準>>> mysql> select name, GROUP_CONCAT( age SEPARATOR ‘#’) from student group by name; ——————————————————— | name | GROUP_CONCAT( age SEPARATOR ‘#’) | ———————————————…

微信紅包系統架構的設計和優化分享

微信紅包系統架構的設計和優化分享 編者按&#xff1a;經過2014年一年的醞釀&#xff0c;2015微信紅包總量創下歷史新高&#xff0c;峰值1400萬次/秒&#xff0c;8.1億次每分鐘&#xff0c;微信紅包收發達10.1億次&#xff0c;系統整體運行平穩, 在這里我分享下微信紅包背后的技…

Jquery各版本下載

jquery-2.1.4 (注&#xff01;jquery-2.0以上版本不再支持IE 6/7/8) 百度引用地址 (推薦目前最穩定的&#xff0c;不會出現延時打不開情況) 百度壓縮版引用地址: <script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> 微軟壓縮版引…

python list方法操作_Python 列表(List)操作方法詳解

參考文獻來源于腳本之家列表是Python中最基本的數據結構&#xff0c;列表是最常用的Python數據類型&#xff0c;列表的數據項不需要具有相同的類型。列表中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff…

FastDFS單機版安裝教程

安裝清單如下&#xff1a; 一、安裝FastDFS 1. 安裝libfastcommon 先解壓安裝包到目錄 # unzip libfastcommon-1.0.36.zip 安裝編譯工具及環境&#xff08;后面Nginx也會用到這些依賴環境&#xff09; # yum -y install gcc gcc gcc-c openssl openssl-devel pcre pcre-deve #…

【原創】Chrome最新版(53-55)再次爆出BUG!

2019獨角獸企業重金招聘Python工程師標準>>> 前言 今年十月份&#xff0c;我曾發布一篇文章《Chrome53 最新版驚現無厘頭卡死 BUG&#xff01;》&#xff0c;不過那個BUG在最新的 Chrome 54 中已經修正。 而今天即將發布的Chrome弱智BUG&#xff1a; 僅 Chrome 53 -…

ThinkPHP 發送post請求

function post($url, $paramarray()){ if(!is_array($param)){ throw new Exception("參數必須為array"); } $httph curl_init($url); curl_setopt($httph, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($httph, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($httph,CURLOP…

vue 打包路由報錯_Vue下路由History模式打包后頁面空白的解決方法

vue的路由在默認的hash模式下,默認打包一般不會有什么問題,不過hash模式由于url會帶有一個#,不美觀,而且在微信分享,授權登錄等都會有一些坑.所以history模式也會有一些應用場景.新手往往會碰到history模式打包后頁面一片空白的情況,而且沒有資源加載錯誤的報錯信息.這個其實仔…

leetcode-回文鏈表

請判斷一個鏈表是否為回文鏈表。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1->2->2->1 輸出: true進階&#xff1a;你能否用 O(n) 時間復雜度和 O(1) 空間復雜度解決此題&#xff1f; 思路&#xff1a;先遍歷鏈表&#xff0c;獲得長度。 把前半部分的鏈表逆置…

進程kswapd0與events/0消耗大量CPU的問題

http://www.nowamagic.net/librarys/veda/detail/2539 今天下午網站宕了兩次機&#xff0c;發工單給阿里云&#xff0c;發現原因是服務器的CPU 100%了。 重啟服務器后&#xff0c;使用 top 命令看看是哪些進程消耗那么大的 CPU 使用。盯了有好十幾分鐘&#xff0c;主要消耗 CPU…

索引器

namespace _03{ class Program { //請編寫一個類&#xff1a;ItcastClass,該類中有一個私有字段_names,數據類型為&#xff1a;字符串數組&#xff0c;長度為5&#xff0c;并且有5個默認的姓名。 //要求&#xff1a;為ItcastClass類編寫一個索引器&#xff0c;要求該索引器能夠…

跑三小時的monkey測試該怎么算_淺談App測試(下)~帶音頻

文 | Vicky采編&#xff5c;Emily淺談App測試(上)&#xff5e;帶音頻一、功能測試?二、性能測試(1)耗電量影響因素&#xff1a;定位、傳感器、藍牙&#xff0c;其中CPU、持續定位是兩個平臺造成耗電的主要因素。(2)流量也就是常說的耗流量&#xff0c;影響因素有重復請求&…