0

我正在子类UITextField化并且需要一种方法来在字段中的文本更改时运行一些代码,我该怎么做?

(在这个类中编写逻辑可以让我在它之外编写更清晰的代码......我的意思是我可以使用UITextFieldDelegate.

4

3 回答 3

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 进行补偿。

于 2014-12-02T14:29:58.697 回答
0

在您的视图控制器的 .h 文件中,只需定义此委托

@interface  yourviewcontroller <UITextFieldDelegate>

之后在 .m 文件中使用下面的代码..

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

              .....Do Somthing Here....

}

这是文本字段文本更改此方法时的委托方法,每次调用。

于 2012-04-19T18:33:33.453 回答
-1

通过不使用 UITextFieldDelegate 方法,代码如何在它之外更清晰?通过尝试告诉视图类(您的 UITextField)如何响应更改,您有点打破了 MVC 设计范式,而这正是控制器的本意。您能否更深入地了解为什么您认为覆盖 setText 而不是在委托实现中处理事情更清洁?

于 2012-04-19T13:35:07.870 回答