2016-01-29 8 views
1

У меня есть подкласс UITextField, который специфичен для обработки текста даты. У меня есть tableviewcell, который использует это текстовое поле:Swift UITextField подменю текстовое изменение текста программно

let dateInput: DateTextField 

Теперь контроллер необходимо инициализировать текст dateInput перед отображением следующим образом:

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

Теперь я хочу, чтобы быть в состоянии обнаружить что текст изменился из подкласса, чтобы я мог обновить внутреннюю переменную даты, чтобы она была синхронизирована с текстом.

Я реализовал методы делегирования текстового поля, но это просто ловит изменения, сделанные пользователем, а не программно.

+0

Возможно, это только я, но я не понимаю, что вы пытаетесь сделать ... Можете ли вы немного разобраться или сделать это яснее? – lukaivicev

+0

У меня есть подкласс UItextField, который отображает только строки Date. Контроллер устанавливает текст программно (dateTextField.text = "01/12/2015"). Поэтому я пытаюсь понять, как поймать, что текст изменился, чтобы я мог обновлять некоторые базовые переменные в классе DateTextField. Это объясняет лучше? –

+0

, поскольку мы говорим о строках здесь, почему бы просто не сделать, если условие где (dateInput.text == "01/29/2016") ...? Это можно сделать в исходном методе, таком как viewWillAppear, и на основе этого сделать асинхронный вызов для backend –

ответ

1

Вы можете переопределить свойство и добавить didSet наблюдателя в пользовательском классе:

class DateTextField: UITextField { 

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

Это именно то, что я искал. Благодаря! –

+6

Внутренние подпрограммы iOS не используют свойства «text» и «attributedText», они предназначены только для внешнего использования. Например, когда пользователь вводит текстовое поле, внутренние события являются единственным способом получить значения textField, потому что UIKit меняет только внутреннюю переменную, а не свойства «text» или «attributedText». – 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 
     } 
    } 
} 
Смежные вопросы