如何在不输入的情况下检测 UITextField 光标移动?

Posted

技术标签:

【中文标题】如何在不输入的情况下检测 UITextField 光标移动?【英文标题】:How to detect UITextField cursor move without typing? 【发布时间】:2017-08-03 19:18:54 【问题描述】:

当用户只移动光标而不输入新单词时(即(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange) replacementString:(NSString *)string 不会被触发),我如何检测此事件?

【问题讨论】:

【参考方案1】:

在viewDidAppear中添加selectedTextRange属性观察者,

[self.txtfield addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld  context:nil];

然后为这个属性添加函数,

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    if([keyPath isEqualToString:@"selectedTextRange"] && self.txtfield == object)
        NSLog(@"cursor moved");

当您移动光标而不输入任何文本时,它应该打印“光标已移动”。

【讨论】:

【参考方案2】:

UITextInput 协议采用的UITextField 中有一个selectedTextRange 属性。因此,您可以使用 KVO 订阅此属性的更改,也可以使用重写的方法 setSelectedTextRange 实现您自己的子类。

【讨论】:

【参考方案3】:

我很确定这是用于光标移动的 UITextField 的任何本机委托,但您可以继承 UITextField 并可以覆盖方法

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
    if let selectedRange = textField.selectedTextRange 

        let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)

        print("\(cursorPosition)")
    

每当光标移动时,它应该可以检查获取光标位置。

【讨论】:

以上是关于如何在不输入的情况下检测 UITextField 光标移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用键盘选项但使用 UIButton 的情况下创建 Speech To UITextField

如何在不触摸或点击文本字段的情况下从动态创建的 UITextField 获取文本(禁用用户交互)?

如何在不按 Enter C# WPF 的情况下检测我的键盘

如何在 Swift 中防止 UITextField 中出现空白或空格?

在不创建新类的情况下访问自定义 UITableViewCell 中的 UITextField?

如何在没有按下输入C#WPF的情况下检测我的键盘