#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?