获取UITextField选择更改通知的最佳方法是什么?

时间:2011-12-20 17:24:28

标签: iphone ios ipad uitextfield

How can I get a textDidChange (like for a UISearchBar) method for a UITextField?中所述,使用通知中心可让您在iOS UITextField中的文本发生变化时收到通知。我没有看到关于选择更改的类似通知。检测和响应UITextField选择中的更改的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

这个link有一个解决方案,没有搞乱私人api:

简而言之:子类UITextField,实现

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

并检查选择范围是否已更改。但是这并没有通知关于水龙头。

所以我做的是在继承子类之后,观察selectedTextRange属性:

-(void)awakeFromNib {
    [self addObserver:self forKeyPath:@"selectedTextRange" options:0 context:nil];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    [self notifyDelegateIfNecessary];
}

在iOS8中运行良好。

答案 1 :(得分:0)

有一种简单的方法可以检测textField中的选择

在viewDidAppear中添加对象属性观察者

  [self.keyboardInputFieldPassword 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.keyboardInputFieldPassword == object)
        [self textFieldDidChangeSelection:self.keyboardInputFieldPassword];
}

这将捕获UITextField

中的选择范围

要遵循惯例,您应该在viewDidDisappear

中删除Observer
[self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil];

答案 2 :(得分:0)

快捷键4

private func listenForSelection(in textField:UITextField) {
    textField.addObserver(self, forKeyPath: "selectedTextRange", options: [.new,.old], context: nil)
}
private func unlistenForSelection(in textField:UITextField) {
    textField.removeObserver(self, forKeyPath: "selectedTextRange")
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    let textField = object as? UITextField
    assert(keyPath == "selectedTextRange")
    assert(textField != nil)
    // select everything but the first and last characters - just and example of the UITextInput API if you want to modify the selection
    if let startPosition = textField.position(from: textField.beginningOfDocument, offset: 1),
        let endPosition = textField.position(from: textField.endOfDocument, offset: -1) {
        let selectionRange = textField.textRange(from: startPosition, to: endPosition)
        textField.selectedTextRange = selectionRange
    }
}

答案 3 :(得分:-3)

使用目标/操作将方法连接到UIControlEventEditingChanged实例上的UITextField控件事件。这可以在界面构建器或代码中完成,方法是在文本字段中添加目标/操作对,然后实现指定的方法。

[self.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];

UITextField还声明了一个UITextFieldDelegate协议,其中包含您可以在类中实现的方法,以便通知UITextField实例的更改。我建议您对委托感到满意,因为它是Cocoa框架中的常见模式。

UITextFieldDelegate Class Reference