Прекратете редактирането, когато щракнете върху друг 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