iOS滚动到超出视图的文本字段

3
我在iOS中使用了一个长表单,并使用静态表格视图来实现。为了增加prev/next和done功能,我需要添加工具栏。 在这个项目中,我使用了BSKeyboardControls,并且在另一个项目中也已经完成了此操作。
工具栏的功能很好,但是当下一个或前一个textField/textView不可见时,前一个textField上的焦点不会改变,我仍然在此文本字段中输入。 当我手动滚动并且目标下一个文本字段出现时,它会神奇地成为第一个响应者。 这显然不是预期的行为。
所以我想到,在尝试将其设置为第一个响应者之前,我必须将表格视图滚动到相应的字段。 但我无法完成此操作。
我已经尝试过使用indexPathes来实现。
NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
[self.tableView scrollToRowAtIndexPat:path atScrollPosition:UITableViewScrollPositionTop animated:YES];

尽管超级父视图是有效的(并且正确)表格单元,但返回的路径为空。我也尝试了一些变化。
CGPoint point = [self.tableView convertPoint:textField.frame.origin toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];

以及其他使用rects和indexPathsForRowsInRect的变化。

唯一的方法是手动跟踪文本字段单元格的indexPath,但在这种情况下,这不是一个合适的解决方案。

有人有想法如何实现在tableView中滚动到看不见的textField吗?

编辑:

正如Justin Paulson所请求的keyboardControlsPreviousNextPressed:的代码:

- (void)keyboardControlsPreviousNextPressed:(BSKeyboardControls *)controls withDirection:(KeyboardControlsDirection)direction andActiveTextField:(id)textField
{
    NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)((UIView *)textField).superview.superview];
    NSLog(@"path %@ for cell %@", path, ((UIView *)textField).superview.superview);
    [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
    [textField becomeFirstResponder];
}

根据日志的输出,路径是空的,而超级父视图是正确的表格视图单元格。


你的代码中 keyboardControlsPreviousNextPressed:withDirection:andActiveTextField: 这个委托函数是什么样子的? - Justin Paulson
谢谢您的快速回复。@Ladislav 我正在使用UITableViewController,但它不会自动滚动。 - patman
@Justin Paulson 我会编辑问题并粘贴代码。 - patman
为什么不把所有的UITextFields都保存在一个NSArray中,这样当点击“下一个”时,你只需要找到相应的UITextField并让它成为第一响应者... - Ladislav
你尝试过在 keyboardControlsPreviousNext... 中更改代码,只需写成 [textField becomeFirstResponder]; 吗?因为 UITableViewController 应该会自动为你滚动。 - Justin Paulson
显示剩余5条评论
1个回答

3
感谢您尝试帮助我,但我已经找到了解决方案。在我的keyboardControlsPreviousNextPressed函数中,我现在有以下内容。
[self.tableView scrollRectToVisible:((UIView *)textField).superview.superview.frame animated:YES];
[textField becomeFirstResponder];

这个解决方案似乎效果不错。唯一遇到的问题是,有时候新聚焦的文本框被键盘挡住了,所以表视图控制器并没有自动调整。你可以将行滚动到顶部,以在大多数情况下规避这个问题。

NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接