2011-11-24 55 views
5

我正在編寫我的第一個iPhone應用程序,並且我一直在探索Cocoa Touch和Objective-C中的設計模式。我來自客戶端Web開發的背景,所以我試圖圍繞代表包圍我的頭。代表與可可觸摸中的事件

具體而言,我不明白爲什麼需要委託對象而不是事件處理程序。例如,當用戶按下一個按鈕時,它會被一個事件(UITouchUpInside)處理,但是當用戶輸入完一個文本框並用'完成'按鈕關閉它時,通過調用文本框的代表(textFieldShouldReturn)。

爲什麼使用委託方法而不是事件?我也注意到這在視圖控制器與viewDidLoad方法。爲什麼不使用事件?

回答

6

編輯:另一個好後: NSNotificationCenter vs delegation(using protocols)?

委託是一個回調所以有一個1:1的關係。委託是實現正式協議的對象的單個實例。

通知(事件)基本上廣播給許多對象,當事情發生時感興趣。

委託是好的,以能夠插代碼到某些其他物體的管道如之前和回調後處理這樣,對於一個控制提供數據源和視圖之間進行通信:

What exactly does delegate do in xcode ios project?

因此代表與對象有更緊密的關係,因爲它們是單個提供的對象,用於插入和更改對象的處理或提供數據。您正在推遲決策和外部操作,如將數據加載到其他對象 - 這就是爲什麼它是通用UIKit類的一個非常常見的模式。對其他物體的通知是非常鬆散的關係 - 只是通知其他人發生了某些事情。

這也不是一個「vs」問題。例如,您可以有一個應用程序執行後臺處理,它會觸發一些更改通知,導致視圖調用其數據源委託來刷新其視圖。他們是兩種不同的機制。

4

一個明顯的區別是委託方法可以有返回值,因爲存在一對一的關係。另一方面,事件與發送課程鬆散耦合,通常不關心有沒有反應。

其他委託方法只是爲了方便而存在,並且可能會觸發相應的事件。

5

活動和代表有兩個不同的目的,所以你會看到兩個使用。

如果你只是想按下按鈕來觸發一條消息,事件就沒有問題。如果您希望您的完成按鈕在文本字段允許失去焦點之前按鍵確認上下文,則可以使用textFieldShouldReturn委託方法處理任何驗證,並在驗證無效時返回NO。

代表確實允許您在不進行子類化的情況下更改行爲。他們充滿了應爲沒有方法爲此目的。當您要在動作之前和/或之後驗證,通知或處理時,您可以實現這些方法,而不是覆蓋操作方法。

如果您發現自己以爲您需要繼承一個UIKit對象,請首先檢查其委託方法。有機會已經有一個地方來放置你的自定義行爲。