0

我正在为 iOS 开发一个自定义键盘,使用 UIInputViewController 我实现了以下方法:textWillChangetextDidChange

我想知道用户何时更改当前文本字段并移动到另一个文本字段以配置键盘中当前按下的文本字段的自动大写参数。

现在我尝试做这样的事情:

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
        }
    }
}

但是这些选项都不适合我。

更新:您可以注意到我在回调方法中收到的对象不是 UITextField 对象,而是 UITextInput 对象,它实际上是一个协议,而不是文本字段本身。所以我不能添加观察者。我的键盘应用程序不控制用户输入文本的字段。

问题:如何识别用户更改当前文本字段的那一刻?

4

1 回答 1

0

我正在使用Objective C,因为此时我可以使用此代码:-

您可以使用KVO,我想您的目标是:-

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]);
          }
    }
于 2015-06-03T10:02:45.410 回答