0

我有一個UITextField子類。我需要知道文本何時發生變化,我可以通過NotificationCenter和觀察.UITextFieldTextDidChange得知,但現在我需要知道用戶何時點擊返回按鈕。我能想到的唯一解決方案是將UITextField子類設置爲它自己的代理,但它聽起來並不乾淨。從UITextField子類捕獲委託方法而不是委託

  1. 有沒有乾淨的方式來獲得子返回鍵事件
  2. 是否確定設置UITextField子類是它自己的代表?
+0

我可以問你爲什麼需要嗎? – Andrea

+0

我正在使用'UITextFieldDelegate',我將代理設置爲適當的textField,其中需要標識RETURN按鈕。然後,您可以使用'func textFieldShouldReturn(_textField:UITextField) - > Bool'來識別是否點擊返回按鈕。儘管如此,我並不十分確定這是否是最乾淨的解決方案。 – AlexWoe89

+0

有一個有趣的討論你的問題的第二點在這裏:https://stackoverflow.com/questions/29054602/does-a-class-being-its-own-delegate-follow-ios-convention –

回答

2

在子類中做

self.addTarget(self, action: #selector(returnKeyPressed), for: .editingDidEndOnExit); 

看着蘋果DOC你看UIControlEvents

UIControlEventEditingDidEndOnExit = 1 < < 19,// '返回鍵' 結尾的編輯

+0

有用的信息。這回答了這個問題。但我最終將textField封裝在一個'UIView'中,並將其作爲'UITextField'的代表,它可以是'private' – iOSGeek

0

您可以將您的viewController設置爲委託。在viewDidLoad中,您可以添加這一行代碼。

myTextField.delegate = self 

您還需要viewController的UITextFieldDelegate協議。

extension MyViewController: UITextFieldDelegate { 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     //User tapped the return button 
     return true 
    } 
} 

我認爲將委託設置到子類沒有任何問題。如果您需要了解班級以外的水龍頭,那麼您將需要另一位代表,以便您可以使用我的第一個解決方案。你也應該知道,如果你改變委託,你的子類中的代碼將不會再被調用,並且可能導致意外的行爲。

+0

你寫的很完美,他問他可以在他的'UITextField'子類中做什麼,在那裏它不建議使用委託,因爲子類的用戶像你上面提到的'MyViewController'想要成爲委託:) – Ladislav

+0

我在問關於讓textField自己委託像這樣: 'textField。委託=自我「,但我知道,ViewController可以是代表 – iOSGeek

+0

我回答了他的兩個問題。第一個人不會在他的子類中要求任何東西。它要求一個乾淨的解決方案,我認爲設置ViewController作爲一個委託是一個乾淨的解決方案。 – Yannick