Завершить редактирование при нажатии на другой UITextView

У меня есть UITableViewController с несколькими пользовательскими ячейками, каждая из которых содержит один UITextView. Я хотел бы, чтобы, если пользователь редактирует ячейку A, а затем щелкает ячейку B, ячейка A заканчивает редактирование, но ячейка B не начинает редактирование.

Прямо сейчас у меня есть следующий распознаватель жестов, который завершает редактирование ячейки при нажатии вне tableView :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];
[tap setCancelsTouchesInView:NO];
[self.view addGestureRecognizer:tap];

Но при нажатии на другой UITextView это текстовое представление вызывает shouldBeginEditingafterwards и, следовательно, игнорируется.

Я пробовал играть с функциями textViewShouldBeginEditing/textViewShouldEndEditing, но безуспешно. Я не знаю, следует ли мне двигаться в этом направлении или создать еще один распознаватель жестов с пользовательским связанным действием?


person vib    schedule 27.07.2015    source источник


Ответы (1)


Есть куча вещей, которые вам нужно настроить, чтобы заставить это работать.

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

Код будет выглядеть примерно так.

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
{
    if self.currentTextField == nil 
    {
      self.currentTextField = textField
      return true 
    } 
    else 
    {
      self.currentTextField!.resignFirstResponder()
      self.currentTextField = nil
    }
}
person Shamas S    schedule 27.07.2015
comment
Спасибо, это именно то, что я искал! Я думаю, что лучше поместить часть resignFirstResponder в часть textFieldDidEndEditing (для случая, когда пользователь касается вне tableView). - person vib; 27.07.2015