我如何检测文本字段中的任何文本变化?委托方法shouldChangeCharactersInRange适用于某些东西,但它并没有完全满足我的需求。因为在它返回YES之前,textField文本对其他观察器方法是不可用的。
例如,在我的代码calculateAndUpdateTextFields没有得到更新的文本,用户已经键入。
是他们的任何方式得到类似textChanged Java事件处理程序。
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
从正确的方法做uitextfield文本更改回调:
我捕获发送到UITextField控件的字符,就像这样:
// Add a "textFieldDidChange" notification method to the text field control.
在objective - c中:
[textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
迅速:
textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
然后在textFieldDidChange方法中,您可以检查textField的内容,并根据需要重新加载您的表视图。
你可以使用它并将calculateAndUpdateTextFields作为你的选择器。
迅捷用户界面
如果你正在使用原生的SwiftUI TextField或只是使用UIKit UITextField(这里是如何),你可以观察文本的变化,如:
SwiftUI 2.0
从iOS 14, macOS 11,或任何其他包含SwiftUI 2.0的操作系统中,有一个名为.onChange的新修饰符,用于检测给定状态的任何变化:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Enter text here", text: $text)
.onChange(of: text) {
print($0) // You can do anything due to the change here.
// self.autocomplete($0) // like this
}
}
}
SwiftUI 1.0
对于旧的iOS和其他SwiftUI 1.0平台,你可以在combine框架的帮助下使用onReceive:
import Combine
.onReceive(Just(text)) {
print($0)
}
注意,您可以使用文本。publisher而不是Just(text),但它返回的是更改的值而不是整个值。
Swift测试版本:
//Somewhere in your UIViewController, like viewDidLoad(){ ... }
self.textField.addTarget(
self,
action: #selector(SearchViewController.textFieldDidChange(_:)),
forControlEvents: UIControlEvents.EditingChanged
)
参数解释道:
self.textField //-> A UITextField defined somewhere in your UIViewController
self //-> UIViewController
.textFieldDidChange(_:) //-> Can be named anyway you like, as long as it is defined in your UIViewController
然后在你的UIViewController中添加你上面创建的方法:
//Gets called everytime the text changes in the textfield.
func textFieldDidChange(textField: UITextField){
print("Text changed: " + textField.text!)
}