如How can I get a textDidChange (like for a UISearchBar) method for a UITextField?中所述,使用通知中心可让您在iOS UITextField中的文本发生变化时收到通知。我没有看到关于选择更改的类似通知。检测和响应UITextField选择中的更改的最佳方法是什么?
答案 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框架中的常见模式。