2016-01-29 67 views
1

我有一個UITextField的子類,它特定於處理日期文本。我有一個使用這個文本字段tableviewcellSwift UITextField子類以編程方式處理文本更改

let dateInput: DateTextField 

現在控制器需要初始化之前的dateInput的文本顯示如下:

cell.dateInput.text = "01/29/2016" 

現在,我希望能夠檢測該文本從子類更改,以便我可以更新內部日期變量,以便它與文本同步。

我實現了textfield委託方法,但它只捕獲用戶所做的更改,而不是以編程方式進行更改。

+0

也許這只是我,但我不明白你在做什麼......你能詳細說明一下還是說清楚一點? – lukaivicev

+0

我有一個只顯示日期字符串的UItextField的子類。控制器正在以編程方式設置文本(dateTextField.text =「01/12/2015」)。所以我想弄清楚如何捕捉文本已經改變,以便我可以更新DateTextField類中的一些後端變量。這是否更好解釋? –

+0

因爲我們在這裏說的是字符串,爲什麼不只是如果條件where(dateInput.text ==「01/29/2016」)...?這可以通過初始方法完成,如viewWillAppear,並基於對後端的異步調用 –

回答

1

您可以覆蓋性,在自定義類中添加didSet觀察員:

class DateTextField: UITextField { 

    override var text: String? { 
     didSet { 
      // Do your stuff here  
     } 
    } 
} 
+0

這正是我所期待的。謝謝! –

+6

內部iOS例程不使用「文本」或「屬性文字」屬性,它們僅供外部使用。例如,當用戶在文本字段中鍵入內容時,內部事件是獲取textField值的唯一方法,因爲UIKit僅更改內部變量,而不是「文本」或「屬性文本」屬性。 – user464230

2

檢查UIControlEventEditingChanged事件...在其中,您可以設置以下邏輯。

來自實例this後:

// Add a "textFieldDidChange" notification method to the text field control. 
[textField addTarget:self 
       action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged]; 
+0

感謝您的更新,但在設置文本時textFieldDidChange未在iOS9中調用(dateTextField.text =「12/01/2015」 )。 –

1

我對這個解決辦法是讓子類的每個實例保持其自己通知UITextFieldDidChange並使用自定義協議將該信息轉發給聽衆。

protocol MutableTextFieldDelegate { 
    func textChanged(_ sender:MutableTextField) 
} 

class MutableTextField : UITextField { 

    var textChangedDelegate : MutableTextFieldDelegate? 

    var previousValue : String? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     NotificationCenter.default.addObserver(forName: .UITextFieldTextDidChange, object: self, queue: nil) { [weak self] notification in 
      guard let strongSelf = self else { return } 
      guard let object = notification.object as? MutableTextField, object == strongSelf else { return } 

      if strongSelf.previousValue != strongSelf.text { 
       strongSelf.textChangedDelegate?.textChanged(strongSelf) 
      } 
      strongSelf.previousValue = strongSelf.text 
     } 
    } 
} 
相關問題