Скрытие клавиатуры при потере фокусировки на UITextView

Итак, у меня есть UITextView, который я использую, чтобы позволить пользователю отправлять текст.

Моя проблема в том, что я не могу понять, как разрешить пользователю "Отменить", удалив из UITextView.

Ответ 1

Упрощение ответ tuzzolotron: Если в вашем xib правильно подключена следующая розетка

    IBOutlet UITextView *myTextView;

Используйте это в контроллере представления:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([myTextView isFirstResponder] && [touch view] != myTextView) {
        [myTextView resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

Нажмите на представление View Controller View, вне текстового вида, смирится с первым ответчиком, закрыв клавиатуру.

Ответ 2

Другой подход, который я использовал много, работая с UITableViews, Searchbar и клавиатурой, я думаю, вы можете применить его к текстовому полю

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
gestureRecognizer.cancelsTouchesInView = NO;  // this prevents the gesture recognizers to 'block' touches
[gestureRecognizer release];

И тут, здесь простая функция обратного вызова

- (void)hideKeyboard {
    [myTextField resignFirstResponder];
}

Надеюсь, что это поможет

Ответ 3

На мой взгляд:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];

    // pass touches up to viewController
    [self.nextResponder touchesBegan:touches withEvent:event];
}

В моем контроллере:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if (keyboardShown && [touch view] != self.TextView) 
    {
         [self.TextView resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

- (void)keyboardWasShown:(NSNotification*)aNotification
{    
        keyboardShown = YES;
}

Ответ 4

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

[self.myTextView endEditing: YES];

Я использую UITableView, поэтому я помещаю эту строку в метод didSelectRowAtIndexPath:. Пока что так хорошо...

Ответ 5

Вот лучшее решение, которое не зависит от выхода и будет работать с любым количеством объектов UITextField в вашем контроллере.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];

    if (![[touch view] isKindOfClass:[UITextField class]]) {
        [self.view endEditing:YES];
    }
    [super touchesBegan:touches withEvent:event];
}

Ответ 6

Очень легко

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

Ответ 7

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    var touch = event.allTouches()?.anyObject() as UITouch

    if( textfield.isFirstResponder() && touch.view != textfield) {
        textfield.resignFirstResponder()
        NSLog("Resigning first responder since touches began outside")
    }

    super.touchesBegan(touches, withEvent: event)
}

Ответ на ohhorob тоже работал у меня. Здесь простой быстрый эквивалент.

Ответ 8

Вот быстрый код

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        if textField.isFirstResponder && touch.view != textField {
            textField.resignFirstResponder()
        }
    }
    super.touchesBegan(touches, with: event)
}

Ответ 9

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

Он использует MonoTouch С#, хотя должно быть очевидно, как преобразовать его в Objective-C

    private void findAndResignFirstResponder(UIView node=null) {
        if (node == null) { return; }
        if (node.IsFirstResponder) {
            node.ResignFirstResponder();
            return;
        }

        foreach (UIView view in node.Subviews) {
            findAndResignFirstResponder(node:view);
        }
    }

    private bool haveDrag = false;
    public override void TouchesEnded(NSSet touches, UIEvent evt) {
        if (!haveDrag) {
            UITouch touch = (UITouch)evt.AllTouches.AnyObject;
            if (!touch.View.CanBecomeFirstResponder) {
                this.findAndResignFirstResponder(this);
                Console.WriteLine("resign");
            }
        }
        base.TouchesEnded (touches, evt);
    }
    public override void TouchesMoved(NSSet touches, UIEvent evt) {
        haveDrag = true;
        base.TouchesMoved (touches, evt);
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt) {
        haveDrag = false;
        base.TouchesBegan (touches, evt);
    }

Ответ 10

Мой способ сделать это...

  • Добавьте ссылку на TextView в @interface вашего ViewController:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView;
    
  • Переопределите этот метод в @implementation вашего ViewController:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        if ([self.yourTextView isFirstResponder]) {
          [self.yourTextView resignFirstResponder];
        }
    }