如何理解 iOS Delegate (委託)設計模式

來源:互聯網
上載者:User

轉載自:http://leopard168.blog.163.com/blog/static/168471844201111411729597/

iOS 程式設計語言是 Objective-C,   簡稱 OC。 談起 OC的特性,人們常說,OC 不支援多繼承。但 Delegate 彌補了這個缺陷。 有了Delegate, 在聲明對象時,可以使其遵循多個協議。 從而解決了多繼承問題。  

Delegate ,又稱為 委託或代理, 它是一種設計模式。  學習iOS開發,需要深入理解 Delegate的用法。 Apple 對Delegate 有明確的說明。http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html     
但理解起來還是有些抽象。

Delegate的用途:

用於改變或控制其他對象 。 

Delegate 的定義:

(1)Delegate 是一個對象, 其類型為 id  (anonymous type: 匿名型別);

(2) Delegate 的引用通常是一個執行個體變數 (instance variable), 命名為 delegate;

 (3)Delegate 內所用的方法是 訪問模式 (Accessors pattern) 

Delegate Message 的命名:

發給Delegate的訊息 通常帶有(should, will, did) 之一。     

should:期待delegate返回一個值;

will:表示變化發生之前 要做的事情;

did : 表示變化發生之後 要做的事情。

Cocoa Touh 的很多類都不同程度地用到Delgete。 比如: NSTextField, NSTableView。  其中 NSTableView 還用到了 Data Source。

其實,Data Source 也是一種委託。 Data Source 減少了 View 與 Model 之間的耦合性。    其中 , NSAppplication 實現了幾十個委託方法。

Delegate 使用的注意事項:

Delegate 是一個 ID 類型的對象, 同樣存在建立和釋放問題。 對於Data Source , 只有Data Source的使用者 (比如Table View)釋放後, Data Souce 才能被釋放。 否則, 就會出現crash。 因為在table view 擷取資料時, 資料已經不見了。   

Delegate 可用在多個情境下,比如對象間的資料互動,   不同視圖之間的行為互動。 若僅僅是資料互動, 可實現的方法還有很多。 Delegate 尤其適用於視圖之間的行為互動。

 這裡通過 UIActionsheet 和 UIAlertView 的使用給以說明。

 UIActionsheet *actionsheet = [ [UIActionsheet alloc]

        initWithTile:@”Are you sure?”

       delegate: self

        cancelButtonTitle: @”No Way!”

        destructiveButtonTitle: @”Yes, I’m sure!”

        otherButtonTitles: nil] ;

 

這裡需特別注意 delegate:self 的使用方法。  它表明 當 actionsheet 的button 被按下時, delegate 會收到通知。更確切地說, delegate 的actionsheet:didDismisswithButtonIndex: 方法將被調用。 將self作為 delegate 參數傳遞給該方法,可以確保 actionsheet:didDismisswithButtonIndex:
被調用。

 Cancelbutton 顧名思義,是取消按鈕。  與此相對應, destructiveButton 是確定按鈕。 通過delegate:self 設定,我們可以在 actionsheet:didDismisswithButtonIndex: 方法中判斷 使用者選擇的是 取消操作還是確定操作。

 如果沒必要區分 哪個按鈕給按下, 直接使用 UIAlertView 即可, 執行個體如下:

  UIAlertView *alert = [ [UIAlertView alloc]

          initWithTitle:@ “Something was done”

          message: @”Everything is OK”

          delegate: nil

          cancelButtonTitle:@”Cancel”

          OtherButtonTitles:nil ];

每個view 都有自己的delegate,同樣, UIAlertView 也有自己的delegate, 如果我們想知道使用者何時關閉了 AlertView 提示框,或想判斷使用者按下的是哪個按鈕,就可以使用 delegate:self。 其實這裡的alertView 只是向使用者提供了一個按鈕,根本無需判斷使用者按下的是哪個按鈕,因此聲明 delegate:nil 即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.