2011-02-07 74 views
9

如果我想處理對UITextField的更改,例如用戶輸入它;似乎可以通過爲該文本字段分配一個委託,然後讓該委託實現shouldChangeCharactersInRange,或者通過向textField添加一個目標以及處理UIControlEventEditingChanged事件來完成此操作。UITextFieldDelegate vs UITextField控件事件

除了使用委託方法,您可以返回NO並因此阻止用戶進行編輯,這兩件事之間是否有區別?

用於處理編輯開始或編輯結束的相同問題。它可以通過適當的委託方法或適當的事件來完成。如果控件事件可以完成必要的工作,那麼textField委託實際上是什麼?

回答

6

你是對的;你基本上可以通過兩者做同樣的事情,但是UIControl是低級的,並且可以通過[UIControl addTarget:action:forControlEvents:]來吸引每個特定的UIEvent到不同的目標,因爲只有一個委託。

我也會說UITextField delegate protocol只是作爲管理UITextField行爲的一種方式,作爲更方便,更高級的UIControl/UIEvent替代方案。

最常見的代表模式是UITableView DataSource和Delegate,我會說使用UITextField委託協議非常相似,因此看起來更直接,而且定義的意圖遠比直接從UIControl處理消息更直接。

9

shouldChangeCharactersInRange在更改發生之前調用,併爲您提供「取消」更改的機會。發生更改後調用UIControlEventEditingChanged

您可以在shouldChangeCharactersInRange中確定textField的結果值,但必須使用提供的範圍手動將replacementString應用於現有文本。 (通過NSString stringByReplacingCharactersInRange)。如果你想知道結果文本,使用UIControlEventEditingChanged更容易,更高效。

shouldChangeCharactersInRange通常用於實現對輸入的驗證檢查 - 也就是說,您可以在輸入字符/粘貼文本時對其進行過濾。例如,如果某個字段用於電話號碼,則如果用戶鍵入非數字字符或嘗試粘貼非數字文本,則可以返回FALSE

您可能會發現在這裏你可以爲多個控件重用代碼的情況下,如果你可以用UIControlEvent-methods.

1

代表團辦法堅持是均質UITextFieldUITextView行爲的方式。

UITextView沒有控制事件。相反,UITextFieldDelegateUITextviewDelegate提供了並行方法。

0

我發現shouldChangeCharactersInRange通過相同的NSRange來插入和刪除文本。您追加一個空格然後將其刪除,shouldChangeCharactersInRange中的參數與文本的重複無法區分。因此shouldChangeCharactersInRange實際上不能預測結果文本。我在原來的問題提出的兩種方法之間找到

6

一個關鍵的區別是,委託"shouldChangeCharactersInRange"被調用UITextField的值更改。 UIControlEventEditingChanged的目標被稱爲AFTERUITextField中的值發生更改。

如果您正在使用這些事件來確保(例如)在啓用「完成」按鈕之前完全填充了對話框中的所有字段,則目標方法可能對您更好。它爲我做了。