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

How to detect UITextField cursor move without typing?

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

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

在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");
}

当您移动光标而不输入任何文本时,它应该打印 "cursor moved"。

我非常确定这是用于光标移动的 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)")
    }
}

只要光标移动,就应该可以检查获取光标位置。