在子类UITextField中实现setText:(NSString *)文本方法

时间:2012-04-19 13:30:59

标签: iphone ios uitextfield subclass

我正在对UITextField进行子类化,并且只要字段中的文本发生变化,就需要一种方法来运行一些代码,我该怎么做?

(在这个类中编写逻辑可以让我在它之外编写更清晰的代码......我的意思是我可以使用UITextFieldDelegate做我正在问你的事情,但我只能从外面访问它类。)

3 个答案:

答案 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比在委托实现中处理事情更干净?