iOS開發之--監聽事件全攻略(一)協議代理

来源:http://www.cnblogs.com/Erma-king/archive/2016/01/14/5130312.html
-Advertisement-
Play Games

iOS開發之 監聽事件全攻略(一)協議代理= 2016年才開始沒幾天,IT業界大事件快播庭審,最近兩天看了快播庭審,真是精彩,王欣辯護人金嘴真是絕了,話說快播辯護人的金嘴,句句金腔,我很贊同辯護人道出當今互聯網業界的一些不合規矩或者不合法律的一些互聯網公司打的擦邊球,拉下幾家知名互聯網公司陪斬,.....


iOS開發之--監聽事件全攻略(一)協議代理

  2016年才開始沒幾天,IT業界大事件快播庭審,最近兩天看了快播庭審,真是精彩,王欣辯護人金嘴真是絕了,話說快播辯護人的金嘴,句句金腔,我很贊同辯護人道出當今互聯網業界的一些不合規矩或者不合法律的一些互聯網公司打的擦邊球,拉下幾家知名互聯網公司陪斬,我很贊同辯護人說的事實,但是快播沒罪麽?快播有罪!快播看毛片的事實不假,毫無疑問,當年快播可能是萬千宅男電腦必備吧!政府的法律法規總是會有滯後性,很多互聯網公司靠著新興科技行業的相關法律或者法規不完整的情況下打擦邊球,也不假,筆者前一段時間在做網站開發,購買了一個全球功能變數名稱,也不知道“某度”是從哪裡獲得我的個人信息,三天兩天的打電話問我的網站是否要推廣,我就納悶叻?我的個人的一些詳細信息,而且是是詳細信息為什麼會被“某度”知道叻?當今的互聯網公司一直在打擦邊球,真希望政府對於新興行業,科技行業能出台一些相關有利於管理的法律法規。

寫博寫博,我希望能幫助更多學習編程的新人們進入IT行業,當今生活在一個互聯網全盛的時代,很多志同道合的朋友們希望進入IT界,希望鄙人的博客能幫助到您一點一點的進步吧,下麵都是個人在iOS開發中一點一點小小的總結吧,正式開始正文吧!

在iOS開發中,監聽一個事件的發生或者變化,常見的有四種。

目錄

1、addTarget註冊事件

2、代理協議

3、通知機制

4、KVO


一、addTarget註冊事件

繼承與UIControl的控制項都可以用addTarget來註冊一個事件,可以在API的UIControl.h的源文中查找到如下方法:

// add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
// passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order  
// the action cannot be NULL. Note that the target is not retained.
(void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

好不好看療效,現在看代碼,看效果

*查API可以看出任何繼承於UIControl的控制項都擁有addTarget的方法,使用addTarget註冊事件的代碼如下:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitle:@"點擊" forState:UIControlStateNormal];
[button addTarget:self action:@selector(didClickButton) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}

-(void)didClickButton{
NSLog(@"%s",__FUNCTION__);
}  

Smaller icon

代碼中調用了一個方法:
addTarget:(nullable id) action:(nonnull SEL) forControlEvents:(UIControlEvents)
第一個參數Target是指被監聽的目標對象,哪個對象發出的事件,就監聽哪個對象
第二個參數action是指監聽其對象中的方法一般用@selector()查詢其方法,方法在目標對象中去查找。
第三個參數forControlEvents是指動作,哪個動作觸發了事件。
這是開發中最常用監聽事件的方法addTarget,只要繼承於UIControl的類都可以調用addTarget方法,那麼不是繼承於UIControl的類,監聽事件我們一般用協議代理
___

二、協議代理

1、協議

1)協議的含義:協議是一系列方法聲明的列表。

聲明的方法可以被任何遵守其協議的類實現,協議里的方法,都是聲名,沒有實現,沒有屬性。

2)協議里的關鍵字

@required 必須實現,不實現有警告(預設)

@optional 可選實現

3)幾個小小的提示註意點:

基協議:@protocol NSObject,所有的自定義協議都必須直接或間接遵守這個基協議.


2、代理

1)代理的含義:找一個代理對象去幫你做事情(是操作另一個對象)。

2)代理的作用:(都是一些官方的術語,看看就好,開發中按照一般常用設計思路做下去都不會出什麼大的問題)

a 降低耦合

代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。

b 提高擴展性

真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務.


3、協議代理在iOS開發中實際的應用

在iOS開發中,協議代理的應用步驟大致分為三步

第一步:定義協議

一般在類的上面用關鍵字@protoco來聲明一個協議,例如:

@protocol XxxDelegate<NSObject> 

一般在開發中很多時候協議已經寫好了,不需要自己定義一個協議,只需要遵守協議和實現協議的代理方法就可以。

第二步:定義一個delegete屬性

在其內部定義一個代理屬性,一般書寫的方式例如:

@property(nonatomic,strong)id<XxxDelegate> delegate;

第三步:觸發代理方法

觸發代理方法也就是觸發協議中定義的方法

一般的書寫格式如下

//判斷代理是否成功遵守協議
if( [self.delegate respondsToSelector:@selector(協議方法) ] ){
[self.delegate 協議方法]
}

Tip:如果是自定義協議,需要自己書寫上面三個步驟,如果是遵守了系統的某個協議,只需要做下麵三步就好


第四步:遵守協議

一個類遵守一個協議,在其類名後面添加:<協議名> eg:

@interface 類名 <XxxDelegate>

第五步:設置代理對象

使其內部的delegate屬性指向需要遵守協議的對象,eg:

制定協議的對象.delegate = self

第六步:實現協議裡面的方法

我之前在網上查閱了關於oc協議代理的一些文章,看過很多知名博主寫關於協議代理這點時,最喜歡用的方法是嬰兒保姆,嬰兒找代理,保姆作為代理,還有收快遞,買汽水等等協議代理的案例,筆者覺得用OC的知識闡述協議代理的知識並不是很客觀,因為嬰兒保姆的案例從開發的邏輯上來說是不可能出現這樣的代理方式,所以筆者不再舉這樣的代理案例。下麵會繼續更新協議代理的案例,用UI的案例來舉例協議代理。

**轉載請註明來自吃飯睡覺擼碼的博客 http://www.cnblogs.com/Erma-king/,並包含相關鏈接。**

1月24日更新:(代理協議數據逆傳案例)


下麵用一個小小案例來舉例說明代理,其中涉及到的其他相關的知識點,筆者不一一詳細贅述。


需求:在B界面textField中輸入內容,再點擊B界面的ChangeButton使A界面的Label中的文字變為在B界面textField中輸入的內容
先看看storyboard中的內容

1

本案例涉及到值的傳遞,而且在多控制器navigationController堆棧和壓棧的問題,筆者不一一贅述,數據逆傳,在開發中處處可見,我想這個案例能夠說明一些代理的問題,還是按照上文的步驟一步一步來實現代理協議

說在前面的話和筆者本人對代理協議的思考與個人看法

B控制器想改變A控制器中的label,B辦不到,所以找代理A,B找代理,協議由B來制定,我看過很多博客或者文章講述代理協議的知識,都用這樣的思考方式去寫協議,找代理,其實,我們可以從另外一個角度去思考這個問題。

筆者本人對協議代理的思考與看法,這個案例中,B控制器點擊了一個Button,要使得A控制器中的Label改變值,可是B控制器不能直接操控A控制器中的Label,但是A控制器可以在內部執行一個方法操控自身的Label,那麼執行這個方法是什麼方法叻?B點擊了一個按鈕,A執行了一個方法,好,這個方法就是協議方法,代理協議是用於監聽事件,什麼是監聽事件,監聽事件本質是監聽方法的調用,但系統調用或則手動調用,不管任何途徑調用了一個方法時,那麼協議方法執行,怎麼才能辦到協議方法在監聽到一個方法被調用的時候,協議方法就會被執行叻?好,現在就引入了代理,也就是delegate屬性,用delegate屬性指向,或者被指向的對象調用協議方法,這樣,就可以實現協議對象執行了一個方法,代理對象執行協議的,這。。。就是監聽。。

上面一段話純屬筆者個人思考和見解,有不同之處歡迎討論,因為筆者認為嬰兒保姆,代收快遞等等案例對協議代理的思考邏輯並不是很符合,所以小小的發表了一些個人思考的方式和看法。

進入實現功能的正題:

第一步:定義協議

在B控制器中制定協議

@class ERTestB;

@protocol ERTestBDelegate <NSObject>

-(void)didClickChangeButton : (ERTestB *) ERTestBView withStr : (NSString *) str;

@end

第二步:定義一個delegete屬性

@interface ERTestB : UIViewController

@property (nonatomic,weak) id <ERTestBDelegate> delegate;

@end

第三步:觸發代理方法

點擊Button後出發代理方法

- (IBAction)didClickChangeButton:(UIButton *)sender {

if ([self.delegate respondsToSelector:@selector(didClickChangeButton:withStr:)]) {
    [self.delegate didClickChangeButton:self withStr:self.textFieldString.text];
}
}

第四步:遵守協議

@interface ERTestA () <ERTestBDelegate>

@property (weak, nonatomic) IBOutlet UILabel *labelStr;

@end

第五步:設置代理對象

跳轉之前執行的方法,在跳轉之前設置代理對象

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
ERTestB * testBVC = segue.destinationViewController;
testBVC.delegate = self;
}

第六步:實現協議裡面的方法

-(void)didClickChangeButton : (ERTestB *) ERTestBView withStr : (NSString *) str{
self.labelStr.text = str;
}

測試執行的圖片:

1

執行成功後的圖片:

1

OK,協議代理筆者的一些研究和看法就寫到這裡吧,這算是我個人的一些思考方式吧,也算是我的開發筆記,希望幫助組到更多的正在努力路上的朋友門。。

**轉載請註明來自吃飯睡覺擼碼的博客 http://www.cnblogs.com/Erma-king/,並包含相關鏈接。**


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Cocoapods安裝步驟1.升級Ruby環境sudo gem update --system如果Ruby沒有安裝,請參考如何在Mac OS X上安裝 Ruby運行環境2.安裝CocoaPods時我們要訪問cocoapods.org,用淘寶的RubyGems鏡像來代替官方版本,執行以下命令:$ ge...
  • 關於NSURL的一些屬性的記錄 1 NSLog(@"%@", request.URL.absoluteString); 2 NSLog(@"%@", request.URL.relativeString); 3 NSLog(@"%@", request.URL.scheme); 4 ...
  • 本文是背景虛化界面設計,在美圖秀秀的背景虛化模塊主要是圖像的模糊處理,可以按照圓形和線性進行模糊處理,並生成選定的形狀。 在開發中遇到的誤區1.模糊形狀使用UIImageView,遇到一些麻煩,即使你向UIImageView對象添加手勢,當你重載touchesBegan時,UIImageVie...
  • //偏好設置是專門用來保存應用程式的配置信息的, 一般情況不要再偏好設置中保存其他數據// 如果利用系統的偏好設置來存儲數據, 預設就是存儲在Preferences文件夾下麵的// 偏好設置會將所有的數據保存到同一個文件中// 獲取NSUserDefaults對象NSUserDefaults *de...
  • 1.在AppDelegate.h 里添加標記2.在AppDelegate.m 里添加這個方法3.使用[(AppDelegate*)[UIApplication sharedApplication].delegate setAllowRotation:YES];來打開屏幕旋轉4.通過使用 [(AppD...
  • 無論哪個平臺,開始哪種應用程式,日誌總是少不了的,大家在Lind.DDD里也可以看到大叔的日誌組件,而在xamarin進行移動開發時,為了更好的調試,記錄運行的情況,日誌也是必須的,這講主要說一下在xamarin for android開發時,日誌組件的實現。對於android平臺有自己的日誌組件,...
  • 通過這種方格圖片實現濾鏡代碼:"CIFilter+ColorLUT.h""CIFilter+ColorLUT.m"#import "CIFilter+ColorLUT.h"#import #import @implementation CIFilter (ColorLUT)+ (CIFilter *...
  • 不少設計師和工程師都被安卓設備紛繁的屏幕搞得暈頭轉向,我既做UI設計,也做過一點安卓界面佈局,剛好對這塊內容比較熟悉,也曾在公司內部做過相關的講座,在此,我將此部分知識重新梳理出來分享給大家!
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...