[英]UiTableView with textfields - scroll when keyboard appears
我在tableview控制器中创建带有文本字段的表单。 我试图在为字段输入值后按返回键来实现两件事:
1)将光标移到下一个字段2)向上滚动表格视图
我的代码可以将光标移动到下一个字段,但是滚动部分不起作用。 你能告诉我我在这里想念的东西吗? 我研究了有关堆栈溢出的类似问题,并遵循它们的建议,但仍然面临问题。 感谢您的投入。
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
if ([textField isEqual:self.firstName]){
//Move cursor to next field
[self.lastName becomeFirstResponder];
//scroll
id cellContainingFirstResponder = textField.superview.superview ;
NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
[self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
if ([textField isEqual:self.lastName]){
//Move cursor to next field
[self.emailId becomeFirstResponder];
//scroll
id cellContainingFirstResponder = textField.superview.superview ;
NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
[self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
if ([textField isEqual:self.emailId]){
//Move cursor to next field
[self.phoneNumber becomeFirstResponder];
//scroll
id cellContainingFirstResponder = textField.superview.superview ;
NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
[self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
if ([textField isEqual:self.phoneNumber]){
//Move cursor to next field
[self.password becomeFirstResponder];
//scroll
id cellContainingFirstResponder = textField.superview.superview ;
NSIndexPath *currentRowIndexPath = [self.signUpTable indexPathForCell:cellContainingFirstResponder];
NSIndexPath *nextRowIndexPath = [NSIndexPath indexPathForRow:currentRowIndexPath.row+1 inSection:currentRowIndexPath.section];
[self.signUpTable scrollToRowAtIndexPath:nextRowIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
// This is the last field hence dismiss keyboard -> This part is working
if ([textField isEqual:self.password]){
[textField resignFirstResponder];
}
return YES ;
}
为了根据文本字段的焦点向上滚动tableview,请尝试以下操作:
- (void) textFieldDidBeginEditing:(UITextField *)textField {
UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
[yourTableView scrollToRowAtIndexPath:[yourTableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
在这里,您可以使用UITableViewScrollPositionTop
将滚动位置设置为顶部
您可能想知道为什么将两个超级视图用于textfield
。 一个用于UITableViewCellContentView
,另一个用于UITableViewCell
以便您可以获取表的当前/焦点单元格的实例。
它有效,我们已经在一个项目中使用了它
我使用viewcontroller作为表视图的数据源。 我的解决方案:
在cellForRowAtIndexPath内部,将目标添加到UIControlEventEditingDidBegin控件事件的文本字段中:
[((YourCustomCell *) cell).textfield addTarget:self action:@selector(textFieldDidBeginEditing:) forControlEvents:UIControlEventEditingDidBegin];
实现命名方法:找到文本字段的单元格并滚动到该单元格
- (void)textFieldDidBeginEditing:(UITextField *)textField{ for ( NSIndexPath *ip in [self.tableview indexPathsForVisibleRows] ){ UITableViewCell * cell = [self.tableview cellForRowAtIndexPath:ip]; if ( [cell isKindOfClass:[YourCustomCell class]]){ if ( [textField isEqual:((YourCustomCell *)cell).textfield] ){ [self.tableview selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionTop]; [self setContinueButtonEnabled:YES]; } } } }
尝试使用此代码可能会对您有所帮助
CGPoint pt;
CGRect rc = [textField bounds];
rc = [textField convertRect:rc toView:scrView];
pt = rc.origin;
pt.x = 0;
pt.y =0;
[scrView setContentOffset:pt animated:YES];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.