我希望能够检测UITextField
中是否更改了某些文字,以便我可以启用UIButton
来保存更改。
答案 0 :(得分:39)
不是观察通知或实施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
尚未向您提供用户刚刚输入的文本 - 您必须应用更改先自己。答案 1 :(得分:32)
利用UITextFieldTextDidChange
通知或在文本字段中设置代理并观看textField:shouldChangeCharactersInRange:replacementString
。
如果您想通过通知关注更改,您需要在代码中输入类似内容以注册notification
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];
此处theTextField是您要观看的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
}
答案 2 :(得分:9)
为此,首先需要让文本字段分配给委托引用。并且delgate应该优选地是视图的文件所有者的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。
答案 3 :(得分:2)
Swift 3.0
流程1
创建UITextfiled的IBOutlet并将目标添加到文本字段。
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
}
答案 4 :(得分:1)
您可以创建一个变量来存储原始字符串,然后向通知中心注册以接收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];
答案 5 :(得分:1)
这可以在Editing Changed
事件UITextField
的Interface Builder中完成。从中拖动到您的代码并创建IBAction
。
例如:
@IBAction func textFieldChanged(_ sender: UITextField) {
print(sender.text)
}
此事件与此处其他答案中描述的相同,因为.text
属性在触发时包含更新的文本输入。这可以帮助清理代码混乱,方法是不必以编程方式将事件添加到视图中的每个UITextField
。
答案 6 :(得分:-3)
您可以添加类似NSString *changeTemp
的类成员,然后添加
changetemp = textfield;
if( change temp != textfild ){
changetemp=textfild;
NSLog(@" text is changed"
} else {
NSLog(@" text isn't changed"):
}