2014-02-03 5 views
7

У меня есть вид UIViewController, который имеет UITextField в качестве подзаголовка. Текстовое поле реализует событие на UIControlEventEditingDidBegin. Это событие устанавливает inputAccessoryView текстового поля и добавляет «теневой» вид в представлении контроллера вида для блокировки взаимодействия с представлением.UITextView в inputAccessoryView не будет resignFirstResponder

inputAccesoryView является UIView с UITextView в качестве подсмотра. UITextView устанавливается как firstResponder, когда отображается клавиатура (зарегистрирована на UIKeyboardDidShowNotification).

Когда «тень» вид прикосновения я называю следующий метод:

-(void)dismissKeyboard 
{ 
    self.dimScreenView.alpha = 0.0f; 
    self.writingView.txtView.text = @""; 

    [self.writingView.txtView resignFirstResponder]; 
} 

Но клавиатура не исчезает, когда вид тени прикосновения. Я пробовал звонить [self.writingView.txtWritingField endEditing:YES] и [self.writingView endEditing:YES], но я не могу заставить его работать.

Должен ли я сделать что-то особенное, чтобы клавиатура исчезла, когда inputAccessoryView имеет подзаголовок, то есть firstResponder?

Update:

Оказывается, что UITextView и UITextField оба возвращается NOisFirstResponder на имущество, даже если я не называю resignFirstResponder. Как ни один из текстовых представлений не будет firstResponder, пока клавиатура все еще присутствует?

+0

вы уверены, что dismissKeyboard срабатывает? – heximal

+0

Да, у меня были точки разрыва, и теневой вид также исчезает при касании. –

+0

writingView и txtView не ноль? – heximal

ответ

0

Вы упомянули, что UITextView указан как firstResponder, но в коде, который вы передаете resignFirstResponder, введите текст. Попробуйте позвонить resignFirstResponder на экземпляр textview.

+0

Извините, в коде может быть не ясно. 'TxtWritingField' является' UITextView'. Я отредактирую имя на 'txtView', чтобы было ясно. –

0

После [self.writingView.txtView resignFirstResponder];

Ваш текстField снова становится первым ответчиком, а клавиатура находится на экране с прежним входным доступом AccessView, остающимся от textView. Так что вам нужно только перезагрузить его:

-(void)dismissKeyboard 
{ 
    self.dimScreenView.alpha = 0.0f; 
    self.writingView.txtView.text = @""; 

    [self.writingView.txtView resignFirstResponder]; 

    self.textField.inputAccessoryView = nil; 
    [self.textField reloadInputViews]; 
} 

Таким образом, вы можете скрыть inputAccessoryView но вам нужен другой способ сделать это в первый раз, потому что ответчику фокус перемещается немедленно TextField.

+1

Звучит разумно, но я не могу заставить accessView исчезнуть, что заставило меня исследовать «firstResponder». Оказывается, что 'UITextView' и' UITextField' возвращают 'NO' в свойство' isFirstResponder', даже если я не называю 'resignFirstResponder'. Мне это очень странно. Вы знаете, почему? –

+1

В моем примере модели UITextField имеет видимый фокус после [UITextView resignFirstResponder]. Странно, если у обоих ваших полей нет. Так что в моем случае self.textField isFirstResponder и я перезагружаю входное представление. – malex

1

как @malex сказал, после [self.writingView.txtView resignFirstResponder];, ваш UITextField снова станет первым ответчиком. Таким образом, вы должны добавить код пусть UITextField отставку первый ответчик тоже:

-(void)dismissKeyboard 
{ 
    self.dimScreenView.alpha = 0.0f; 
    self.writingView.txtView.text = @""; 

    [self.writingView.txtView resignFirstResponder]; 
    [yourTextField resignFirstResponder]; 
} 
Смежные вопросы