【发布时间】:2013-03-07 13:29:39
【问题描述】:
我希望能够检测UITextField 中的某些文本是否发生了更改,以便我可以启用UIButton 来保存更改。
【问题讨论】:
标签: objective-c ipad ios6 uitextfield uitextfielddelegate
我希望能够检测UITextField 中的某些文本是否发生了更改,以便我可以启用UIButton 来保存更改。
【问题讨论】:
标签: objective-c ipad ios6 uitextfield uitextfielddelegate
与其观察通知或实现textField:shouldChangeCharacterInRange:replacementString:,不如添加一个事件目标更容易:
[textField addTarget:self
action:@selector(myTextFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
- (void)myTextFieldDidChange:(id)sender {
// Handle change.
}
请注意,事件是UIControlEventEditingChanged 而不是 UIControlEventValueChanged!
与其他两个建议的解决方案相比的优点是:
NSNotificationCenter 取消注册控制器。textField.text 包含用户实际输入的文本。 textField:shouldChangeCharacterInRange:replacementString: 委托方法在应用更改之前被调用,因此textField.text 尚未向您提供用户刚刚输入的文本 - 您必须先自己应用更改。
【讨论】:
UITextFieldDelegate method(您需要调用stringByReplacingCharactersInRange:withString: 以获取更改的结果字符串)。
利用UITextFieldTextDidChange 通知或在文本字段上设置代理并注意textField:shouldChangeCharactersInRange:replacementString。
如果您想通过通知查看更改,您需要在代码中使用类似的内容来注册notification:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];
这里的TextField 是您要观看的UITextField 的实例。上面代码中self是实例的类必须实现textFieldDidChange,像这样:
- (void)textFieldDidChange:(NSNotification *)notification {
// Do whatever you like to respond to text changes here.
}
如果文本字段的寿命将超过observer,那么您必须注销观察者的dealloc 方法中的通知。实际上,即使文本字段的寿命不超过观察者,这样做也是一个好主意。
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
// Other dealloc work
}
【讨论】:
为此,首先您需要为您的文本字段分配委托引用。并且,最好应该是作为视图文件所有者的 vew 控制器。 就像
myTextField.delegate = myViewControllerReferenceVariable
并在您的 viewController 界面中,告诉您将通过
实现 UITextFieldDelegate@interface MyViewController:UIViewController<UITextFieldDelegate>
并且在您的视图控制器实现中覆盖
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
所以代码看起来像
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
if (textfield == refToTextFieldYouWantToCheck) {
if ( ! [textToCheck isEqualToString:text] ) {
[theButtonRef setEnabled:YES];
}
}
return YES; //If you don't your textfield won't get any text in it
}
您还可以订阅通知,恕我直言,这有点混乱 你可以找到如何做到这一点here。
【讨论】:
fo,然后又输入了另一个o,那么textField.text 仍然是fo,而不是foo!您必须自己应用更改。
stringByReplacingCharactersInRange 的最新字符串。检查修改后的代码。
斯威夫特 3.0
流程 1
创建 UITextfiled 的 IBOutlet 并将 Target 添加到文本字段。
m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)
func textFieldDidChange(textField:UITextField)
{
NSLog(textField.text!)
}
流程 2
m_lblTxt.delegate = self
//MARK: - TextField Delegates
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
print(textField.text!)
return true
}
【讨论】:
这可以在 Interface Builder 中对 UITextField 的 Editing Changed 事件完成。从它拖到你的代码并创建一个IBAction。
例如:
@IBAction func textFieldChanged(_ sender: UITextField) {
print(sender.text)
}
此事件与此处其他答案中的描述相同,.text 属性在触发时包含更新的文本输入。这可以帮助清理代码混乱,不必以编程方式将事件添加到视图中的每个UITextField。
【讨论】:
您可以创建一个变量来存储原始字符串,然后向通知中心注册以接收UITextFieldTextDidChangeNotification事件:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];
然后,创建一个接收通知的方法,并将文本字段的当前值与原始值进行比较
-(void) updateButton:(NSNotification *)notification {
self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}
当视图控制器被释放时,不要忘记取消注册通知。
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
【讨论】:
你可以像这样NSString *changeTemp添加一个类成员,然后
changetemp = textfield;
if( change temp != textfild ){
changetemp=textfild;
NSLog(@" text is changed"
} else {
NSLog(@" text isn't changed"):
}
【讨论】: