Я столкнулся с одним и тем же случаем использования пользовательской кнопки очистки. Я попытался подклассифицировать 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 для компенсации.
UITextField - класс представления. NSString - это класс модели. –
Абсолютно. Обновлено. – jmstone617
Мне нужно это, чтобы создать пользовательскую кнопку очистки, поэтому исполняемый код будет тем, что кнопка исчезнет, когда нет текста, а другой - для удаления текста в поле. – Francesco