我想,如果一些文本是在改变能够检测UITextField
,这样我就可以启用一个UIButton
保存更改。
Answer 1:
充分利用的UITextFieldTextDidChange
通知或设置文本字段的委托,并注意textField:shouldChangeCharactersInRange:replacementString
。
如果你想观看与通知的变化,你需要这样的事情在你的代码为注册notification
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];
这里theTextField是实例UITextField
要观看。 类,其自的是在代码的实例上述然后必须执行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
}
Answer 2:
相反,观察通知或实施的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
还没有给你用户只需输入的文本-你必须自己先应用更改。
Answer 3:
对于这一点,首先你需要让你的文本框有其委派参考分配。 和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
}
您还可以订阅通知这是有点乱恕我直言,你可以找到如何做到这一点在这里 。
Answer 4:
雨燕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
}
Answer 5:
您可以创建一个变量来存储原始字符串,然后与通知中心注册接收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];
Answer 6:
这可以在Interface Builder上完成Editing Changed
的情况UITextField
。 从它拖动到你的代码,并创建一个IBAction
。
例如:
@IBAction func textFieldChanged(_ sender: UITextField) {
print(sender.text)
}
本次活动是在其他的答案在于这里所描述的相同.text
属性包含更新的文本输入时被触发。 这可以帮助不必事件编程方式添加到每个清理代码杂乱UITextField
在视图中。
Answer 7:
您可以添加一个类的成员像这样NSString *changeTemp
,然后
changetemp = textfield;
if( change temp != textfild ){
changetemp=textfild;
NSLog(@" text is changed"
} else {
NSLog(@" text isn't changed"):
}