【问题标题】:How to test if User has changed UITextInput?如何测试用户是否更改了 UITextInput?
【发布时间】:2015-08-17 11:00:00
【问题描述】:

我正在为 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 对象,它实际上是一个协议,而不是文本字段本身。所以我不能添加观察者。 我的键盘应用程序不控制用户输入文本的字段。

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

【问题讨论】:

    标签: ios swift uitextfield uitextinput uiinputviewcontroller


    【解决方案1】:

    我正在使用 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]);
              }
        }
    

    【讨论】:

    • 一般来说,UIKit 不兼容 KVO。 stackoverflow.com/questions/6333600/…
    • @Anton 感谢您的评论!我认为你在这里错过了这个概念!让我澄清一下,“KVO 不一定适用于那个 UIKit 类中已经存在的键”,所以我在这里使用了不同的方法。因此,在发表评论之前,请对其进行深入研究。顺便说一句,KVO 在我目前在应用商店中的所有应用中运行良好,甚至更新到 iOS 8。
    • @Vizllx 我并不是说没有人应该使用 KVO。 UIKit 的 KVO 合规性是偶然的,您不应该依赖它,正如一位 UIKit 开发人员 (Dave DeLong) 所说。请在此处查看他的答案:stackoverflow.com/a/6738557/430633。出于这个原因,ReactiveCocoa 开发人员在 UITextView 和 UITextField 组件中添加了rac_textSignal - 只是因为“text”属性不是“严格”符合 KVO,对它们进行 KVO-ing 会导致奇怪的错误。
    • @Anton 看来您花时间进行深入研究。无论如何,请阅读此内容 - developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… 。戴夫给出的答案永远不会被认为是真实的,除非它被记录在案。此外,到目前为止,我还没有遇到任何崩溃问题,Crashlytics 也没有向我报告过使用 KVO 报告的任何此类崩溃。
    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多