2016-01-29 69 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 
     } 
    } 
} 
相关问题