UITextView не имеет событий
-
22-07-2019 - |
Вопрос
Я разрабатываю приложение для iPhone, которому требуется многострочное текстовое поле (UITextView) для захвата некоторого текста.
Когда пользователь прикасается к экрану TextView, он становится firstResponder и отображает клавиатуру.Что мне действительно нужно сделать, так это удалить клавиатуру, когда пользователь закончит.Обычно при использовании текстового поля нажатие кнопки return / done сигнализировало бы об окончании набора текста, и я бы использовал делегат для увольнения первого респондента.Однако с многострочным textview я хочу, чтобы пользователь мог добавить новую строку, так что это невозможно.
Моим следующим вариантом было бы уволить первого ответчика, если есть подправка за пределами текстового представления.Проблема здесь в том, что в UITextView нет событий, объявленных, которые я могу видеть в interface builder.
Как я могу создать многострочное текстовое поле в приложении для iPhone, которое выпустит first responder в разумное время, когда пользователь закончит с ним?
Решение
Вы можете использовать кнопку Готово на панели навигации:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
}
чтобы закрыть клавиатуру, обработайте событие следующим образом:
- (void) doneAction: (id) sender{ [textView resignFirstResponder]; }
(помните объявления файлов .h)
Другие советы
Полагаю, вы оплакиваете " пропали без вести " Кнопка «Готово» на клавиатуре, которая отображается в многострочном UItextView, исправьте меня, если я ошибаюсь.
Очевидный подход, кажется, имеет еще одну кнопку на вашем интерфейсе, которая подает в отставку первого респондента. Р>
Я не думаю, что какой-нибудь умный код, который скрывает клавиатуру при каком-либо событии, был бы очень интуитивно понятен в использовании.
Приложение Apple Notes использует верхнюю правую кнопку «Готово» для отставки первого респондента, такой подход кажется разумным.
//If user touches outside of the keypad, then the keypad will go away
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if (touch.tapCount >= 1) {
[ZLabel resignFirstResponder];
}
}
Вы можете создать невидимую кнопку, которая покрывает весь экран, а затем добавить к ней метод. Я думаю, что это будет работать.
- (IBAction)backgroundClick:(id)sender{
[textView resignFirstResponder];
}
Если вы полностью настроены на использование клавиши "готово" на клавиатуре, метод, который я использую, - проверять последний символ в UITextView при изменении содержимого.Если последний символ является новой строкой, значит, пользователь нажал кнопку готово.Я бы поддержал мнение Нила о том, что должна быть еще одна кнопка, но иногда клиент получает то, что хочет.
Очевидно, вам нужно будет установить делегат для UITextView таким образом, чтобы он указывал на класс, в котором находится этот метод.Тот Самый - (void)textViewDidChange:(UITextView *)inTextView
метод является частью протокола UITextViewDelegate.
- (void)textViewDidChange:(UITextView *)inTextView {
NSString *text = inTextView.text;
if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') {
message = [text substringToIndex:[text length] -1];
[delegate messageEdited];
[self removeFromSuperview];
}
}
(BOOL)TextView:(UITextView *)TextView должен изменять текстовый диапазон:(NSRange)диапазон замены текста:(NSString *) текст {
[txtView resignFirstResponder];
возврат ДА;}