Перейти к следующему UItextField

У меня есть некоторые UITextfields в UItableView. текстовые поля были разделены на подклассы в UITableViewCell, который я создал. Мне бы хотелось узнать, как перейти к следующей ячейке в соответствующем ряду после нажатия клавиши возврата на клавиатуре.

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

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

Это мой код для определения ключа возврата.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
    return YES;
}

и это то, как выглядит мой вид таблицы клеток.

любая помощь будет оценена.

для получения дополнительной информации, это, как я добавляю настраиваемые текстовые поля celltextfield в UItextfield.

NSString *widthString = [currentFinishingDictionary objectForKey:@"w"];
    if ((NSNull *) widthString != [NSNull null]) {
        cell.widthTexField.text = widthString;
        cell.widthTexField.delegate = self;
        cell.widthTexField.tag = indexPath.row;
    } else {
        cell.widthTexField.text = @" ";
        cell.widthTexField.delegate = self;
        cell.widthTexField.tag = indexPath.row;
    }

    NSString *heightString = [currentFinishingDictionary objectForKey:@"h"];
    if ((NSNull *) heightString != [NSNull null]) {
        cell.heightTextField.text = heightString;
        cell.heightTextField.delegate = self;
        cell.heightTextField.tag = indexPath.row;
    } else {
        cell.heightTextField.text = @" ";
        cell.heightTextField.delegate = self;
        cell.heightTextField.tag = indexPath.row;
    }

6 ответов

Я думаю, что проблема может заключаться в том, как теги присваиваются UITextFields.

Пожалуйста, проверьте, действительно ли значения тегов соответствуют вашим ожиданиям.

Убедитесь, что вы установили тег на UITextField

Вы должны попробовать следующим образом:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //[[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
    // Get here you cell seleted Refrecne
      id obj = [cell.contentView viewWithTag:textField.tag+1];

      if([obj isKindOfClass:[UITextField class]]) {
        UITextField *nextField = (UITextField*)obj
         [nextField becomeFirstResponder];
     } 
    return YES;
}

Или вы можете использовать ELCTextFieldCell

Содержит UITextField и UILabel в одной ячейке. Вы можете настроить в соответствии с вашими потребностями.

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
      [yourtextfield resignFirstResponder];
      // save state, etc if necessary
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell * cell = (MyCell *)[tableView cellForRowAtIndexPath:indexPath];
    self.selectedField = cell.tf; // cell.tf is a UITextField property defined on MyCell
    [yourtextfield becomeFirstResponder];
}

Если вы попытались использовать collectionView вместо tableview, дизайн представлений коллекции можно сделать похожим на добавленное изображение, и вы можете добавить одно текстовое поле в одну ячейку, а затем сделать первый ответчик для текстового поля width, выполнив это.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ( [tableView.dataSource tableView:tableView numberOfRowsInSection:0] > tag + 2)
        CustomCell *cell = [self.myTableview cellForRowAtIndexPath:[NSIndexPath indexPathForRow: textField.tag+2 inSection:0]];

        [cell.textField becomeFirstResponder];

}

Если вы хотите сохранить этот дизайн, вы можете сделать это

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{

     int xPosition = (int)textField.frame.origin.x;

     CustomCell *cell = [self.myTableview cellForRowAtIndexPath:[NSIndexPath indexPathForRow: textField.tag+1 inSection:0]];

     if((int)cell.textField1.x == xPosition)
     {
          [cell.textField1.x becomeFirstResponder];

     }
    else
     {
          [cell.textField2.x becomeFirstResponder];
     }

}

Код не скомпилирован. Только логика написана. Надеюсь, это поможет:)

Измените свои значения тегов, как показано ниже, которые могут вам помочь.

NSString *widthString = [currentFinishingDictionary objectForKey:@"w"];
    if ((NSNull *) widthString != [NSNull null]) {
        cell.widthTexField.text = widthString;
        cell.widthTexField.delegate = self;
        cell.widthTexField.tag = indexPath.row;
    } else {
        cell.widthTexField.text = @" ";
        cell.widthTexField.delegate = self;
        cell.widthTexField.tag = indexPath.row;
    }

    NSString *heightString = [currentFinishingDictionary objectForKey:@"h"];
    if ((NSNull *) heightString != [NSNull null]) {
        cell.heightTextField.text = heightString;
        cell.heightTextField.delegate = self;
        cell.heightTextField.tag = indexPath.row + 2000;
    } else {
        cell.heightTextField.text = @" ";
        cell.heightTextField.delegate = self;
        cell.heightTextField.tag = indexPath.row + 2000;
    }

Теперь ваш текстовый тег выглядит так, как показано ниже, и может работать так, как вам нужно.

0 2000
1 2001
2 2002
3 2003
4 2004
.. ........

Теперь ваш метод работает правильно, но нужно продумать и другую идею, потому что это будет неправильно, если у вас 2000 ячеек.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    // i.e. textField.tag == 6 then next 6 + 1 == 7
    // i.e. textField.tag == 20006 then next 2006 + 1 == 2007
    [[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
    return YES;
}

Ты можешь использовать

   - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {


UITableViewCell *cell = [self.myTableview cellForRowAtIndexPath:[NSIndexPath indexPathForRow: textField.tag+1 inSection:0]];
UITextField *tf = (UITextField*)[cell viewByTag:textField.tag+1]
[tf becomeFirstResponder];
        return YES;
    }
Другие вопросы по тегам