我有一个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;
}
Tableview方法:
- (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类信息。这将显着降低可用类型信息的质量。
答案 0 :(得分:1)
以下是您可以应用以实现您的要求的高级逻辑。
- (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 :(得分: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;
}
答案 2 :(得分:0)
我认为您的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
。