我正在子类UITextField
化并且需要一种方法来在字段中的文本更改时运行一些代码,我该怎么做?
(在这个类中编写逻辑可以让我在它之外编写更清晰的代码......我的意思是我可以使用UITextFieldDelegate
.
我正在子类UITextField
化并且需要一种方法来在字段中的文本更改时运行一些代码,我该怎么做?
(在这个类中编写逻辑可以让我在它之外编写更清晰的代码......我的意思是我可以使用UITextFieldDelegate
.
我遇到了需要自定义清除按钮的相同用例。我尝试子类化 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 进行补偿。
在您的视图控制器的 .h 文件中,只需定义此委托
@interface yourviewcontroller <UITextFieldDelegate>
之后在 .m 文件中使用下面的代码..
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
.....Do Somthing Here....
}
这是文本字段文本更改此方法时的委托方法,每次调用。
通过不使用 UITextFieldDelegate 方法,代码如何在它之外更清晰?通过尝试告诉视图类(您的 UITextField)如何响应更改,您有点打破了 MVC 设计范式,而这正是控制器的本意。您能否更深入地了解为什么您认为覆盖 setText 而不是在委托实现中处理事情更清洁?