我正在对UITextField
进行子类化,并且只要字段中的文本发生变化,就需要一种方法来运行一些代码,我该怎么做?
(在这个类中编写逻辑可以让我在它之外编写更清晰的代码......我的意思是我可以使用UITextFieldDelegate
做我正在问你的事情,但我只能从外面访问它类。)
答案 0 :(得分:1)
我遇到了需要自定义清除按钮的相同用例。我尝试了UITextField的子类化,希望我可以覆盖setText:但结果证明这是一个死胡同,因为每次输入或删除字符都不会被调用。我提出了以下解决方案:
- (void)awakeFromNib {
[super awakeFromNib];
self.clearButtonMode = UITextFieldViewModeNever;
UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[clearButton setTitle:@"x" forState:UIControlStateNormal];
[clearButton addTarget:self action:@selector(clearText:) forControlEvents:UIControlEventTouchDown];
self.rightView = clearButton;
[self addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textChanged:(UITextField *)sender {
self.rightViewMode = sender.text.length > 0 ? UITextFieldViewModeWhileEditing : UITextFieldViewModeNever;
}
- (void)clearText:(UIButton *)sender {
self.text = @"";
[self textChanged:self];
}
使用UIControlEventEditingChanged,我们可以对键盘带来的文本更改作出反应,但不能通过在代码中设置文本。因为我还想响应clearText:方法带来的文本,所以我必须在clear之后手动调用textChanged:方法。如果文本在其他地方的代码中设置,则需要调用textChanged来补偿。
答案 1 :(得分:0)
在viewcontroller的.h文件中,只需定义此deledate
即可@interface yourviewcontroller <UITextFieldDelegate>
之后在.m文件中使用以下代码..
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
.....Do Somthing Here....
}
这是textfield文本每次更改此方法时的委托方法
答案 2 :(得分:-1)
使用UITextFieldDelegate方法,不如何使代码更清晰?你试图通过告诉视图类(你的UITextField)如何响应变化来破坏MVC设计范例,这就是控制器的意图。您是否可以更深入地了解为什么您认为覆盖setText比在委托实现中处理事情更干净?