Вопрос

Я разрабатываю приложение для 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];
    

    возврат ДА;}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top