Отключить клавиатуру для UITextField в ячейке UITableView

#ios #objective-c #uitableview #uitextfield

#iOS #objective-c #uitableview #uitextfield

Вопрос:

У меня есть UITableView, которому я присвоил UITextField для каждой ячейки. Я хочу иметь возможность принимать ввод из каждого текстового поля и отключать клавиатуру, когда пользователь нажимает в любом месте экрана, кроме клавиатуры. Это код, который у меня есть до сих пор, но я обнаружил, что клавиатура отключается только тогда, когда я нажимаю на последнюю ячейку в таблице.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.gradesTableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    self.tf = [[UITextField alloc] initWithFrame:CGRectMake(225, (cell.contentView.bounds.size.height-30)/2, 50, 30)];

    [self.tf setDelegate: self];
    self.tf.tag = indexPath.row;

    self.tf.textAlignment = NSTextAlignmentCenter;
    self.tf.placeholder = @"0";
    self.tf.backgroundColor = [UIColor grayColor];
    self.tf.borderStyle = UITextBorderStyleRoundedRect;
    self.tf.keyboardType = UIKeyboardTypeDecimalPad;

    [cell addSubview:self.tf];

    cell.textLabel.text = [self.adderArrayLabels objectAtIndex:indexPath.section];
    return cell;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    self.tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
    [self.view addGestureRecognizer:self.tapGR];
    NSLog(@"Started editing");
}
 

Я пробовал оба endEditing: и resignFirstResponder , но оба только отключают клавиатуру, когда я нажимаю на текстовое поле в последней ячейке.

 - (void)tap {
    [self.tf endEditing:YES];
    //[self.tf resignFirstResponder];

    NSLog(@"tap called");
    self.tapGR.enabled = NO;
}
 

С помощью инструкций NSLog в коде я могу подтвердить, что метод tap вызывается каждый раз, когда распознается соответствующий жест касания, но клавиатура все равно остается. Как мне это исправить?

Комментарии:

1. Вы должны добавить распознаватель жестов viewDidLoad . Вам нужно добавить его только один раз — не каждый раз, когда начинается редактирование текстового представления.

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

3. Правильно. Это означает, что если я попытаюсь отредактировать 5 текстовых полей, жест распознает, что он создан 5 раз, когда его нужно создать только один раз, viewDidLoad в.

Ответ №1:

Проблема здесь:

 self.tf
 

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

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

Затем измените свой метод tap на этот:

 - (void)tap {
    [self.view endEditing:YES];

    NSLog(@"tap called");
    self.tapGR.enabled = NO;
}
 

И действительно, метод, вероятно, должен быть: - (void)tap:(id)sender;

Кроме того, как я уже прокомментировал, следует добавить распознаватель жестов viewDidLoad . Нам нужно добавить его только один раз, а не каждый раз, когда начинается редактирование текстового поля. Единственная причина добавлять ее каждый раз, когда начинается редактирование текстового поля, — это если вы также удаляете ее каждый раз, когда редактирование текстового поля заканчивается… но поскольку метод, который вызывает жест, просто избавляется от клавиатуры, я не вижу причин для этого.

Комментарии:

1. Ладно, в этом действительно есть смысл. Что касается метода - (void)tap:(id)sender; , то, похоже, это не вариант при объявлении селектора при создании средства распознавания жестов. Я удаляю его каждый раз, когда распознается нажатие, потому что чувствую, что его вызов viewDidLoad сделает остальную часть экрана бесполезной, так как он будет включен только для того, чтобы следить за нажатием. Все равно попытаюсь.

2. @Marcus Нравится это: @selector(tap:)