2012-04-19 2 views
0

Я подклассифицирую UITextField и мне нужен способ запускать код всякий раз, когда текст в поле изменяется, как я могу это сделать?Внедрить setText: (NSString *) текстовый метод в подклассе UITextField

(Написание логики внутри этого класса позволит мне писать более чистый код за его пределами ... Я имею в виду, что я могу делать то, что я прошу вас, используя UITextFieldDelegate, но я могу получить к нему доступ только извне класса.)

ответ

-1

Как очиститель кода вне его от не с использованием метода UITextFieldDelegate? Вы как бы нарушаете парадигму проектирования MVC, пытаясь сказать классу вида (ваш UITextField), как реагировать на изменения, что и должен делать контроллер. Не могли бы вы дать немного больше информации о том, почему вы считаете, что чистить переопределить setText, а не обрабатывать вещи в реализации вашего делегата?

+0

UITextField - класс представления. NSString - это класс модели. –

+0

Абсолютно. Обновлено. – jmstone617

+1

Мне нужно это, чтобы создать пользовательскую кнопку очистки, поэтому исполняемый код будет тем, что кнопка исчезнет, ​​когда нет текста, а другой - для удаления текста в поле. – Francesco

0

В файле .h вашего ViewController просто определить этот deledate

@interface yourviewcontroller <UITextFieldDelegate> 

После этого в .m использования файла внизу кода ..

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

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

} 

это метод делегата, когда текстовое поле текст изменен этот метод называется каждый раз .

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: я должен вызвать метод textChanged: вручную, следуя очистке. Если текст установлен в коде в другом месте, необходимо будет вызвать textChanged для компенсации.

Смежные вопросы