2009-08-04 20 views
1

在許多情況下,如使鍵盤消失時使用的點擊完成後,有兩種選擇:設置文本字段的委託自我,並採用UITextFieldDelegate協議,然後使用方法iPhone Dev - 代表或事件?

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

resignFirstResponder並返回YES。但是你也可以

 addTarget:self 
     action:@selector(myMethod:) 
forControlEvent:UIControlEventDidEndOnExit]; 

或類似的東西,使用沒有結束對退出事件,然後在該方法中,[sender resignFirstResponder]。那麼在這樣的情況下,最好的選擇是什麼:代表或事件?

回答

0

如果您將與另一個班級進行配對,那個班級的實際類型可能會有所不同,那麼將該配對正式化爲協議和代理安排非常有意義。

如果要發送的信息針對的是更廣泛的對象,那麼它開始使用通知更有意義 - 儘管現在由於沒有中心定義,您已經稍微模糊了通知所傳遞的信息爲了期待什麼。

這兩者的工作量相當 - 與委託你必須自己設置,然後記住在你被釋放之前取消自己的設置。你必須對通知做同樣的事情,記得在你被釋放之前開始傾聽並取消訂閱。

此外,您應該儘可能地嘗試確保您在主線程上發送通知,因爲通知是從它們開始的同一個線程發送的。委託方法也是如此,從其他神祕線程調用委託方法並不是很好。

1

快速的經驗法則是,代表應該回答「我該嗎?」的問題。代表他們是代表的對象。另一方面,事件播放後讓聽衆知道發生了什麼事情。

在你的情況下,雖然你可以調用[sender resignFirstResponder]來響應事件,但你通過這樣做來混合隱喻。您的代表應該已經決定隱藏鍵盤(或不是),並且正在廣播的事件僅僅是讓所有其他組件知道他們鍵盤隱藏。

+0

所以在隱藏鍵盤的情況下,它應該使用委託方法來做[textField resignFirstResponder];並返回YES? – mk12 2009-08-04 19:46:58

+0

@ Mk12聽起來對我有用 – Peter 2009-08-04 20:27:44

0

委託讓你的對象更具可重用性,它們是一個適配器,它允許任何對象與該對象的定義行爲進行交互並使用該對象。我想說,代表應該被負責維護狀態和定義行爲的對象所採用,這些行爲將會發生在它正在使用的對象中。事件應該用於任何其他對象,這些對象在具有該協議的對象所做的特定操作中發生了變化(因此對象不負責保持定義該協議的對象的狀態)。

例如:使用文本字段的視圖控制器將採用其協議來解除鍵盤和文本字段可能出現的其他任何行爲,也可能其他控制器在鍵盤被解除時執行一些動畫,因此它將註冊爲textfield作爲一個事件,以便接受鍵盤事件被解僱。