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

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

【问题讨论】:

    标签: ios objective-c xcode uitextfield uitextfielddelegate


    【解决方案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)")
            }
        }
        

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

        【讨论】:

          猜你喜欢
          • 2013-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 1970-01-01
          • 1970-01-01
          • 2013-06-17
          相关资源
          最近更新 更多