1. 程式人生 > >iOS 徹底學會使用delegate

iOS 徹底學會使用delegate

 委託delegation的介紹:         

委託delegation是一種簡單但是功能強大的設計模式,它的功能是程式中一個物件代表另一個物件,或者一個物件與另外一個物件協同工作。委託物件保留了另外一個物件的引用,即就是委託,以及在合適的時候傳送訊息給委託。訊息通知事件的委託方法,委託物件將要處理或已經處理。委託可能通過更新本身或者本應用的其他物件的狀態或者外觀來對訊息進行響應,在某些情況下委託也可能返回值,從而影響即將發生事件的處理方式。委託模式的主要價值是讓你通過一箇中心物件,簡單的自定義某些物件的行為。

委託與Cocoa 平臺

委託物件是典型的一種平臺物件,而且委託是典型的一種自定義的控制器物件。在一個通過管理的記憶體環境中,委託物件保留了它的委託的弱引用,而在垃圾回收的環境中,接收者即委託物件保留它的委託的強引用。委託delegation

的例子廣泛存在於Foundation, UIKit, AppKit, 以及其他的r Cocoa 和 Cocoa Touch平臺上。

以AppKit平臺上NSWindow類的例項來作為委託物件為例。NSWindow類聲明瞭協議,協議包含了windowShouldClose:方法。當用戶點選了窗體的關閉按鈕,那麼窗體物件就傳送windowShouldClose:給它的委託,並請求委託來關閉窗體。委託將返回一個布林值,用來控制窗體物件的行為。

Framework object sending a message to its delegate

下面講一下在ios 中如何使用delegate

首先,宣告delegate。例如:

//返回使用者輸入的委託

@protocol EnterDelegate  <NSObject>

@required//這個可以是required,也可以是optional

-(void)Entered:(NSInteger)amount;

@end

在委託的宣告中,我們只定義了一個方法,它將給rootViewController返回從使用者輸入獲得的一個NSInteger物件。 

其次,在rootViewController中定義一個委託物件。如下程式碼:

@interface EnterViewController : UIViewController {
    
    IBOutlet UITextField *InputTextField;
    
    id < EnterDelegate > delegate;
    
}
-(IBAction)cancel
-(IBAction)save;
@property(nonatomic,assign)id delegate;
@end

上面的程式碼中“id < EnterDelegate > delegate”聲明瞭id物件,並指向已經定義的delegate的引用。那麼我們需要為該id物件新增一些屬性,從而讓EnterViewController能夠訪問它。

接下來實現委託方法。因為delegate Entered:方法是必須的,所以需要實現該方法。

-(void)Entered:(NSInteger)amount
{
    InputLabel.text = [NSString stringWithFormat:@"%i" , amount];
}

最後,完成委託物件給委託傳送訊息。即在EnterViewController的實現檔案.m中完成上面定義的一些方法

-(IBAction)savePressed
{
    //確定委託是否存在Entered方法
    if([delegate respondsToSelector:@selector(Entered:)])
    {
        //傳送委託方法,方法的引數為使用者的輸入
        [delegate Entered:[InputTextField.text intValue]];
    }
    
    [self dismissModalViewControllerAnimated:YES];
}

savePressed方法與工具欄中的儲存按鈕相聯絡。當用戶完成了數字輸入以及點選了儲存,即觸發該方法。

====================================================

上面的過程就是如何使用委託的過程,雖然功能是很簡單的。

從委託方法的實現來看,委託方法的實現是在另外一個類中完成,即委託類的內部暴露了,與我們一般堅持的隱藏實現原則相違背。

從委託類的定義可以看出,委託與協議有一定的相似性。都採用protocol關鍵字來宣告

,並且其中的方法都有optional和required,都需要對required方法和呼叫的optional方法進行實現。而不同的是在委託物件所在的類中需要定義一個delegate物件,並且為id型別。

但是delegate與protocol沒有關係。Delegate本身應該稱為一種設計模式,是把一個類自己需要做的一部分事情,讓另一個類(也可以就是自己本身)來完成,而實際做事的類為delegate。而protocol是一種語法,它的主要目標是提供介面給遵守協議的類使用,而這種方式提供了一個很方便的、實現delegate模式的機會

相關推薦

iOS 徹底學會使用delegate

  委託delegation的介紹:         委託delegation是一種簡單但是功能強大的設計模式,它的功能是程式中一個物件代表另一個物件,或者一個物件與另外一個物件協同工作。委託物件保留了另外一個物件的引用,即就是委託,以及在合適的時候傳送訊息給委託。訊息通

iOS 徹底學會使用delegate

 委託delegation的介紹:          委託delegation是一種簡單但是功能強大的設計模式,它的功能是程式中一個物件代表另一個物件,或者一個物件與另外一個物件協同工作。委託物件保留了另外一個物件的引用,即就是委託,以及在合適的時候傳送訊息給委託。訊息通知事件的委託方法,委託物件將要處理或

iOS多執行緒--徹底學會多執行緒之『pthread、NSThread』

轉載於作者:行走的少年郎連結:http://www.jianshu.com/p/cbaeea5368b11. pthread pthread簡單介紹下,pthread是一套通用的多執行緒的API,可以在Unix / Linux / Windows 等系統跨平臺使用,使用C語言編寫,需要程式設計師自己管理執行

iOS多執行緒--徹底學會多執行緒之『RunLoop』

連結:http://www.jianshu.com/p/d260d18dd551 文章目錄 RunLoop簡介 1.1 什麼是RunLoop? 1.2 RunLoop和執行緒 1.3 預設情況下主執行緒的RunLoop原理 RunLoop相關類 2.1 CFRunLoopRef 2.2 CFRunLoop

教你徹底學會動態規劃——進階篇

ret 簡單 aik 原理 初始 cin while iostream urn 在我的上一篇文章中已經詳細講解了動態規劃的原理和如何使用動態規劃解題。本篇文章,我將繼續通過例子來讓大家更加熟練地使用動態規劃算法。 話不多說,來看如下例題,也是在動態規劃裏面遇

ios 協議(delegate)使用過程中遇到assign attribute must be unsafeunretained

今天在使用協議的過程中,偶然發現這樣使用 @interface AppDelegate (){ id<ChatDelegate> testdelegate; } @property (nonatomic , assign) id<ChatDelegate>

五分鐘徹底學會iptables防火牆--技術流ken

  iptables簡介   IPTABLES 是與最新的 3.5 版本 Linux核心整合的 IP 資訊包過濾系統。如果 Linux 系統連線到因特網或 LAN、伺服器或連線 LAN 和因特網的代理伺服器, 則該系統有利於在 Linux 系統上更好地控制 IP 資訊包過濾和防火牆配

五分鐘徹底學會iptables防火墻--技術流ken

-o 啟動 dnat 標誌位 簡單 linux 7 iptable filter 擴展名 iptables簡介 IPTABLES 是與最新的 3.5 版本 Linux內核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接

徹底學會Go指標--就要學習Go語言

什麼是指標 寫程式碼的時候,我們通過變數就可以操作儲存在記憶體中的值,進行賦值、加減運算等。大家有沒有想過,變數代表什麼呢?其實,一個變數對應一段記憶體空間,這段空間就儲存了該變數相對應型別的值。指標的值就對應變數的地址,只通過指標,就可以更新或者讀取變數的值,而不需要用到變數名。 var i int =

教你徹底學會c語言動態規劃——進階篇

今天小編給大家帶來了c語言動態規劃的進階篇。溫馨提示:亮點在最後!   如果想學c++並想學好,可以加這個群,首先是玖四捌,中間是玖伍四,最後是四捌四,裡面有大量的學習資料可以下載。 在我的上一篇文章中已經詳細講解了動態規劃的原理和如何使用動態規劃解題。本篇文章,我將繼續

iOS中的delegate的用法和規範

delegate是Objective-C編寫的應用中各種物件之間互相呼叫的主要方式之一. 通常情況下, 物件可以接收的訊息都通過在介面檔案中宣告的方法來表示. @protocol MyProtocol <NSObject> - (void)func; @en

ios中關於delegate(委託)的使用心得

委託是Cocoa中最簡單、最靈活的模式之一。委託是指給一個物件提供機會對另一個物件中的變化做出反應或者影響另一個物件的行為。其基本思想是:兩個物件協同解決問題。一個物件非常普通,並且打算在廣泛的情形中重用。它儲存指向另一個物件(即它的委託)的引用,並在關鍵時刻給委託發訊息。訊息可能只是通知委託發生了某件事情,

android之儲存篇_SQLite資料庫_讓你徹底學會SQLite的使用

SQLite最大的特點是你可以把各種型別的資料儲存到任何欄位中,而不用關心欄位宣告的資料型別是什麼。例如:可以在Integer型別的欄位中存放字串,或者在布林型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的

徹底學會使用epoll(四)——ET的寫操作例項分析

首先,看程式四的例子。 l 程式四 點選(此處)摺疊或開啟 #include <unistd.h> #include <iostream> #include <sys/epoll.h> using namespace s

教你徹底學會動態規劃——入門篇

    動態規劃相信大家都知道,動態規劃演算法也是新手在剛接觸演算法設計時很苦惱的問題,有時候覺得難以理解,但是真正理解之後,就會覺得動態規劃其實並沒有想象中那麼難。網上也有很多關於講解動態規劃的文章,大多都是敘述概念,講解原理,讓人覺得晦澀難懂,即使一時間看懂了,發現當

iOS中協議delegate的傳值注意點

1、iOS中協議的用途一般是用來進行反向傳值,一般步驟如下: 1)宣告協議 @protocol ThirdDalegate <NSObject> -(void)printNum:(

iOS多播Delegate類——GCDMulticastDelegate用法小結

    iOS中通常的delegate模式只能有一個被委託的物件,這樣當需要有多個被委託的物件時,實現起來就略為麻煩,在開源庫XMPPFramework中提供了一個GCDMulticastDelegate類,使用它可以為一個物件新增多個被委託的物件,用起來也比較方便,用法簡單小結如下:     (1)定義一

從 poj 1163( The Triangle )教你徹底學會動態規劃——入門篇

動態規劃相信大家都知道,動態規劃演算法也是新手在剛接觸演算法設計時很苦惱的問題,有時候覺得難以理解,但是真正理解之後,就會覺得動態規劃其實並沒有想象中那麼難。網上也有很多關於講解動態規劃的文章,大多都是敘述概念,講解原理,讓人覺得晦澀難懂,即使一時間看懂了,發現當自己做題的時

徹底學會使用epoll(三)——ET的讀操作例項分析

首先看程式一,這個程式想要實現的功能是當用戶從控制檯有任何輸入操作時,輸出”hello world!”。 l 程式一 點選(此處)摺疊或開啟 #include <unistd.h> #include <iostream> #incl

教你徹底學會動態規劃

部落格轉自:http://lib.csdn.net/article/datastructure/9390  動態規劃相信大家都知道,動態規劃演算法也是新手在剛接觸演算法設計時很苦惱的問題,有時候覺得難以理解,但是真正理解之後,就會覺得動態規劃其實並沒有想象中那麼難。網上