我通过拖拽生成了一个文本框和一个按钮,我希望实现的功能是
“文本框输入为空时,按钮禁用,文本框输入不空时,按钮可用”
我使用的方式是用一个动作绑定与文本框编辑有关的事件,其中inputField代表文本框,primeFactorizationButton代表按钮
@IBAction func changeButton(_ sender: AnyObject) {
if(inputField.text == ""){
primeFactorizationButton.isUserInteractionEnabled=false
}
else{
primeFactorizationButton.isUserInteractionEnabled=true
}
}
但是这种方法仍然不好用,好像实际上的需要是实时监听文本框的值,inputField.text,实时调整 button 的可用状态,请问我应该怎么修改代码呢?
天蓬老师2017-04-18 09:35:27
方法1: 设置 inputField.delegate 。在 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
中计算出最终的 text,根据 text.length 判断是否禁用按钮。- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
中计算出最终的 text,根据 text.length 判断是否禁用按钮。
方法2: 监听通知 UITextFieldTextDidChangeNotification
,NSNotificationCenter.defaultCenter.addObserver
时 object
UITextFieldTextDidChangeNotification
,NSNotificationCenter.defaultCenter.addObserver
时 object
传你的 inputField, 然后在处理方法里判断:🎜
self.actionButton.enabled = self.inputField.text.length > 0;
高洛峰2017-04-18 09:35:27
最近刚好做到了这个功能, 还是挺好做的, 先遵守UITextFIeld的代理协议 , 实现下面这个方法:
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
self.nextButton.enabled = NO;
self.nextButton.selected = NO;
return YES;
}
然后创建一个通知, 在通知的监听方法里做判断就可以了:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange) name:UITextFieldTextDidChangeNotification object:nil];
- (void)textFieldDidChange
{
if (self.nameField.text.length == 0 || self.IDCardField.text.length == 0 || self.contactPhoneField.text.length == 0 || self.contactPhoneField.text.length < 11 || self.addressField.text.length == 0 || self.postcodeField.text.length == 0) {
self.nextButton.enabled = NO;
self.nextButton.selected = NO;
} else {
self.nextButton.enabled = YES;
self.nextButton.selected = YES;
}
}
但是记得把通知移除掉:
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
还有一种方法是用RAC, 响应式编程, 这个做更方便, 只是我暂时不会, 你也可以试试
大家讲道理2017-04-18 09:35:27
补充一个优雅的
textField.addTarget(self, action: #selector(self.change(_:)), forControlEvents:.EditingChanged)
func change(textField1:UITextField){
// 进行判断
}