Как отклонить клавиатуру для UITextView с клавишей возврата? - PullRequest
370 голосов
/ 01 апреля 2009

В библиотеке IB введение говорит нам, что при нажатии клавиши return клавиатура для UITextView исчезнет. Но на самом деле ключ return может действовать только как '\ n'.

Я могу добавить кнопку и использовать [txtView resignFirstResponder], чтобы скрыть клавиатуру.

Но есть ли способ добавить действие для клавиши return на клавиатуре, чтобы мне не нужно было добавлять UIButton?

Ответы [ 33 ]

6 голосов
/ 23 февраля 2016

быстрый

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
    }
    return true
}

and configure

5 голосов
/ 08 сентября 2012

Добавление наблюдателя в viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

, а затем используйте селектор для проверки "\ n"

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

Он использует \ n и не проверяет ключ возврата, но я думаю, что все в порядке.

UPDATE

См. Ответ Рибто ниже, где вместо 1011 ** 1015 используется [NSCharacterSet newlineCharacterSet]

5 голосов
/ 27 февраля 2014

Просто решил эту проблему по-другому.

  • Создайте кнопку, которая будет помещена в фоновом режиме
  • Из Инспектора атрибутов измените тип кнопки на пользовательский, и кнопка станет прозрачной.
  • Разверните кнопку, чтобы охватить весь вид, и убедитесь, что кнопка находится позади всех других объектов. Простой способ сделать это - перетащить кнопку в верхнюю часть списка в представлении
  • Элемент управления перетащите кнопку в файл viewController.h и создайте действие (Отправленное событие: Touch Up Inside), например:

    (IBAction)ExitKeyboard:(id)sender;
    
  • В ViewController.m должно выглядеть так:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
    
  • Запустите приложение, и когда вы щелкнете мышью из TextView, клавиатура исчезнет
5 голосов
/ 21 марта 2012

Так же, как матовый комментарий к samvermette, мне также не нравится идея обнаружения «\ n». Клавиша «возврата» существует по причине в UITextView, то есть, конечно, для перехода к следующей строке.

Лучшее решение, на мой взгляд, это имитировать приложение для сообщений iPhone - добавить панель инструментов (и кнопку) на клавиатуре.

Я получил код из следующего сообщения в блоге:

http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

Шаги:

-Добавить панель инструментов в ваш файл XIB - установите высоту 460

-Добавить элемент кнопки панели инструментов (если еще не добавлен). Если вам нужно выровнять его по правому краю, также добавьте элемент кнопки гибкой панели в XIB и переместите элемент кнопки панели инструментов

-Создайте действие, которое связывает ваш элемент кнопки с resignFirstResponder следующим образом:

- (IBAction)hideKeyboard:(id)sender {
    [yourUITextView resignFirstResponder];
}

-Тогда:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}
4 голосов
/ 06 декабря 2013

Попробуйте это:

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}
4 голосов
/ 06 ноября 2014

код Swift

Реализация UITextViewDelegate в вашем классе / Выглядеть так:

class MyClass: UITextViewDelegate  { ...

установить делегат textView на себя

myTextView.delegate = self

А затем реализовать следующее:

  func textViewDidChange(_ textView: UITextView) {
    if textView.text.characters.count >= 1 {

        if let lastChar = textView.text.characters.last {

            if(lastChar == "\n"){

              textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
              textView.resignFirstResponder()
            }
        }
    }
}

EDIT Я обновил код, потому что никогда не стоит менять пользовательский ввод в текстовом поле для обходного пути и не сбрасывать состояние после завершения кода взлома.

4 голосов
/ 19 января 2015

// Вы можете использовать это ...

Шаг 1. Первый шаг - убедиться, что вы заявили о поддержке протокола UITextViewDelegate. Это делается в вашем заголовочном файле, в качестве примера можно привести заголовок

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end

Шаг 2. Далее вам необходимо зарегистрировать контроллер в качестве делегата UITextView. Продолжая из приведенного выше примера, вот как я инициализировал UITextView с EditorController в качестве делегата…

- (id) init {
    if (self = [super init]) {
        // define the area and location for the UITextView
        CGRect tfFrame = CGRectMake(10, 10, 300, 100);
        messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
        // make sure that it is editable
        messageTextView.editable = YES;

        // add the controller as the delegate
        messageTextView.delegate = self;
    }

Шаг 3. И теперь последний кусок головоломки - предпринять действия в ответ на сообщение shouldCahngeTextInRange следующим образом:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
  replacementText:(NSString *)text
{
    // Any new character added is passed in as the "text" parameter
    if ([text isEqualToString:@"\n"]) {
        // Be sure to test for equality using the "isEqualToString" message
        [textView resignFirstResponder];

        // Return FALSE so that the final '\n' character doesn't get added
        return FALSE;
    }
    // For any other character return TRUE so that the text gets added to the view
    return TRUE;
}
3 голосов
/ 24 февраля 2014

Вы также можете скрыть клавиатуру при касании на экране просмотра:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }
3 голосов
/ 31 января 2012

Хорошо. Все дали ответы с хитростями, но я думаю, что правильный путь для достижения этой цели -

Подключение следующего действия к событию " Did End On Exit " в Interface Builder. (щелкните правой кнопкой мыши TextField и перетащите cntrl из '. Закончилось ли при выходе ' следующим способом.

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}
3 голосов
/ 23 сентября 2015

Я использовал этот код для смены респондента.

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }
...