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



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

在 viewDidAppearselectedTextRange中添加属性观察器,

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

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

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

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

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

最新更新