2016-07-26 51 views
1

爲了簡單起見,假設我想創建一個自定義UITextField,我想向它添加一個簡單的行爲;也就是說,如果文本字段成爲第一個響應者,則背景顏色將更改爲綠色。如何獲取UITextField的委託事件同時繼承它,而不會丟失委託,如果它的用戶將自己設置爲委託?

爲此,在我的自定義類中,我必須將該類設置爲委託來接收成爲第一響應者的事件。但事情是,如果此自定義文本字段的用戶將自己設置爲委託事件不發送到自定義文本字段(因爲只有一個對象可以是另一個對象的代表)

我可以手動轉發所有事件,但我正在尋找更清潔,更具擴展性的解決方案。

這裏的情況草圖:

class MyTextField: UITextField { 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     delegate = self 
    } 
} 

extension MyTextField: UITextFieldDelegate { 
    func textFieldDidBeginEditing(textField: UITextField) { 
     backgroundColor = UIColor.greenColor() 
    } 
} 

但如果MyTextField用戶做到這一點:

class ViewController: UIViewController { 
    @IBOutlet weak var myTextField: MyTextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myTextField.delegate = self 
    } 
} 

的行爲將無法正常工作;因爲與MyTextField的代理關係消失了。

注意:我不只是想成爲第一個響應的問題,而這是關於使用委託的任何方法,用我定製的UITextField的用戶設置自己作爲代表的能力,在同一時間。

謝謝,提前。

回答

0

正如你所說,大多數代表團只限於作爲代表的單個對象。

由於文本字段是響應者,因此您應該能夠覆蓋func becomeFirstResponder() -> Bool以更改顏色,同時讓對象的用戶按預期處理委派。

UIResponder docs:「子類可以重寫此方法來更新狀態或執行某些操作,如突出顯示選擇。」

+0

@philip感謝您的回覆。事情是,我只是爲了簡單而使用這個例子;我的問題不僅僅是成爲第一響應者,我更感興趣的是知道如何在我的自定義UIKit類的用戶將自己設置爲委託後將子類化爲UIKit類並在自定義類中使用委託而不會丟失委派連接。 – Erfan

+0

@philip順便說一下,是否有任何代表團不僅限於一個對象? – Erfan

+0

在SDK中,我不確定。我們在內部完成了我們想要支持多個回調但具有比KVO或通知提供的更多結構(即協議)的情況。 –