2015-06-03 4 views
0

Я занимаюсь разработкой пользовательских клавиатуры для прошивки, используя UIInputViewController я реализовал следующие методы: textWillChange, textDidChange.Как проверить, если пользователь изменил UITextInput:

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

Теперь я пытался сделать что-то вроде этого:

override func textWillChange(textInput: UITextInput) { 
    if !textInput.isEqual(self.mCurrentTextInput) { 
     Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "TextInput has changed!") 
     KeyboardState.sharedInstance.setAutoCapitalizationFlag() 
    } 
    self.mCurrentTextInput = textInput 
} 

Или даже что-то вроде этого:

override func textWillChange(textInput: UITextInput) { 
    if self.mCurrentTextInput == nil { 
     if let view = textInput.textInputView { 
      self.mCurrentTextInput = view 
      KeyboardState.sharedInstance.setAutoCapitalizationFlag() 
     } 
     Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "TextInput has changed!") 
    } else if self.mCurrentTextInput!.isEqual(textInput) { 
     Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "TextInput has changed!") 
     if let view = textInput.textInputView { 
      KeyboardState.sharedInstance.setAutoCapitalizationFlag() 
      self.mCurrentTextInput = view 
     } 
    } 
} 

Но ни один из этих вариантов не работает для меня.

UPDATE: Как вы можете заметить объект я получаю в методах обратного вызова не является объектом UITextField, но объект UITextInput, который на самом деле является протокол, а не само текстовое поле. Поэтому я не могу добавить наблюдателя. Приложение для клавиатуры не управляет полями, в которые пользователь вводит текст.

Вопрос: У кого-то есть что-то подобное или есть идея, как я могу узнать, как пользователь меняет свое текущее текстовое поле.

Заранее спасибо.

ответ

0

Я использую Objective C, так как у меня есть это доступный в данный момент времени код: -

Вы можете использовать КВО, я думаю, для вашей цели: -

static void *contextNew = &contextNew; 

//Observe change to txtfeild.text: 

[self.txtfeild addObserver:self forKeyPath:@"text" 
      options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld 
      context:contextNew]; 


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
     change:(NSDictionary *)change context:(void *)context { 

      if(context == contextNew) { 

       NSLog(@"txtfeild new text : %@ - txtfeild Old text: %@", 
       [change objectForKey:NSKeyValueChangeNewKey], 
       [change objectForKey:NSKeyValueChangeOldKey]); 
      } 
    } 
+0

Вообще , UIKit не соответствует KVO. http://stackoverflow.com/questions/6333600/does-key-value-observing-work-on-uitextviews-text-property – Anton

+0

@Anton Спасибо за комментарий! Думаю, вам здесь не хватает этой концепции! Позвольте мне уточнить вас: «KVO не обязательно будет работать для ключей, которые уже существуют в этом классе UIKit», поэтому я использую здесь другой подход. Поэтому, прежде чем комментировать, пройдите подробное исследование. Кстати, KVO отлично работает во всех моих приложениях, которые в настоящее время находятся в магазине приложений и даже обновлены до iOS 8. – Vizllx

+0

@Vizllx Я не говорю, что никто не должен использовать KVO. Соответствие KVO UIKit является случайным, и вы не должны полагаться на него, как сказал один из разработчиков UIKit (Дейв ДеЛонг). См. Его ответ здесь: http://stackoverflow.com/a/6738557/430633. По этой причине разработчики ReactiveCocoa добавили 'rac_textSignal' к компонентам UITextView и UITextField - только потому, что свойство« text »не является« строго »KVO-совместимым, KVO-ing может привести к появлению странных ошибок. – Anton

 Смежные вопросы

  • Нет связанных вопросов^_^