Переместить текст в следующий текстовый файл в UITableViewCell

#ios #objective-c #uitableview #uitextfield

#iOS #objective-c #uitableview #uitextfield

Вопрос:

У меня есть один UITableView и есть несколько UITableViewCell .

В каждой ячейке есть один UITextFiled .

Теперь я добавляю текст в текстовый файл 1-й строки. Теперь я хочу переместить текст во 2-ю строку textfiled, когда этот диапазон текста достигает ширины экрана.

Редактировать :

Метод делегирования текстового файла

  - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    CGFloat textWidth = [textField.text sizeWithAttributes:@{NSFontAttributeName : textField.font}].width;
    CGFloat frameWidth = textField.frame.size.width - 11;

    if(textWidth > frameWidth) {

       //text reaches to screen width.
       [textField resignFirstResponder];

       MemoTableViewCell *nextCell = [_tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:(textField.tag 1) inSection:0]];
       [nextCell.noteTextField becomeFirstResponder];

      return NO;
  }

return YES;

}
  

Методы просмотра таблиц:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *simpleTableIdentifier = @"SimpleTableItem";

    MemoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
          cell = [[MemoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    cell.noteTextField.delegate = self;
    cell.noteTextField.tag = indexPath.row;

    return cell;
}
  

Теперь я хочу переместить текст, когда указанный выше метод возвращает NO.

Извините за мой плохой английский. Я надеюсь, вы понимаете мой вопрос, а если нет, то спросите меня.

Помогите мне, пожалуйста.

Редактировать

Приведенный выше код работает нормально, но через некоторое время он выйдет из строя в строке ниже

 CGFloat textWidth = [textField.text sizeWithAttributes:@{NSFontAttributeName : textField.font}].width;
  

Предупреждение: не удалось загрузить информацию о классе Objective-C. Это значительно снизит качество доступной информации о типе.

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

1. Что вы подразумеваете под «я хочу переместить текст»? Вы хотите сделать next textField первым ответчиком или вы хотите переместить текст из текущего textField в следующий?

2. @Adeel Я хочу, чтобы текст в следующей ячейке стал первым ответчиком, когда его текст достигнет ширины экрана.

3. проверьте подключение делегата текстового поля. Где вы его установили? в Fileowner или View? Я сомневаюсь, что вы могли подключить его к просмотру

4. @Wolverine Да, я подключил его к просмотру.

5. Делегат должен быть подключен к владельцу файла контроллера. если у вас есть .xib для ячейки, попробуйте программно установить их делегирование в cellForRow, а если нет, то установите для них владельца файла контроллера, который вы можете увидеть в раскадровке.

Ответ №1:

Попробуйте приведенный ниже код, может быть, это поможет:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {


CGFloat textWidth = [textfield.text sizeWithAttributes:@{NSFontAttributeName : textfield.font}].width;
CGFloat frameWidth = textfield.frame.size.width;

    if(textWidth > frameWidth) {

       //text reaches to screen width.
       [textfield resignFirstResponder];

        /*
        //Get next TextField and Make it first responder
        [cell.YourNextTextField becomeFirstResponder]; 
        */

        return NO;
    }

    return YES;
}
  

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

1. Спасибо, я постараюсь дать вам знать.

2. конечно, дайте мне знать, если у вас возникнут какие-либо проблемы @EktaPadaliya

3. Он работает нормально, но при получении этого предупреждения не удалось загрузить какую-либо информацию о классе Objective-C. Это значительно снизит качество доступной информации о типе.

4. Я думаю, что это не связано с приведенным выше кодом, попробуйте найти его или опубликовать новый вопрос@EktaPadaliya

5. отметьте это как ответ, если это помогло решить вашу проблему, чтобы это помогло другим@EktaPadaliya

Ответ №2:

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

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

   CGSize size = [textField.text sizeWithAttributes:
@{NSFontAttributeName: [UIFont systemFontOfSize:textField.font]}];

   if (size.width > textField.frame.size.width) {

      //text reaches to screen width.
      [textfield resignFirstResponder];

       /*
          //Get next TextField and Make it first responder
          [cell.myTextField becomeFirstResponder]; 
       */
       /*
        Add code logic here
        1. Get the next cell instance - using cellForRowAtIndexPath
        2. Get its textfield instance - cell.myTextField
        3. Make that one as first responder - [cell.myTextField becomeFirstResponder]; 
        */
       return NO;
   }

   return YES;
}
  

Это установит текстовое поле следующей ячейки в качестве основного ввода и увеличит вашу ячейку до этого предела.

Возможно, вам потребуется соответствующим образом установить позицию просмотра.

Надеюсь, это поможет.

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

1. Спасибо за ваше время и ваш ценный ответ. Я постараюсь дать вам знать.

2. Этот метод делегирования текстового файла работает только до 25 символов. Я хочу добавить текст в качестве ширины экрана. Вы поняли мой вопрос?

3. Он работает нормально, но при получении этого предупреждения не удалось загрузить какую-либо информацию о классе Objective-C. Это значительно снизит качество доступной информации о типе.

4. @EktaPadaliya Обновленный ответ — здесь вам нужно измерить шрифт-ширина текста соответствует ширине текстового поля и, соответственно, идти дальше.

5. @EktaPadaliya : Проверьте сейчас.

Ответ №3:

Я предполагаю, что у вас tableView есть только один раздел. Замените код в shouldChangeCharactersInRange: на этот.

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

BOOL shouldChange = YES;

NSString *text = [textField.text stringByAppendingString:string];

CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: textField.font}].width;

CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;

if (textWidth > screenWidth) {

    shouldChange = NO;

    NSInteger cellIndex = textField.tag;

    NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0];

    if (cellIndex < numberOfRows - 1) {

        NSIndexPath *nextIndexPath = [NSIndexPath indexPathForRow:cellIndex 1 inSection:0];

        [self.tableView scrollToRowAtIndexPath:nextIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

        TableViewCell *cell = [self.tableView cellForRowAtIndexPath:nextIndexPath];

        [cell.textField becomeFirstResponder];
    }
}

return shouldChange;
}
  

И не забудьте установить свой тег textField в cellForRowAtIndexPath: , т.е. cell.textField.tag = indexPath.row .

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

1. Та же проблема не удалось загрузить информацию о классе Objective-C. Это значительно снизит качество доступной информации о типе. Я получаю это предупреждение.

2. в какой строке вы получаете это предупреждение?

3. CGFloat textWidth = [размер текста с атрибутами:@{NSFontAttributeName: TextField.font}].width;

4. Работает ли код так, как вы ожидаете, потому что я не получаю никаких предупреждений, и код также работает нормально. А вы пробовали очищать свой проект или перезапускать Xcode?