3

我对 iOS 中的长表单有疑问。表单本身是使用静态表格视图完成的。对于表单,我需要一个带有 prev/next 的工具栏并完成。在这个项目中,我添加了BSKeyboardControls,并且我已经在另一个项目中自己完成了。

工具栏工作正常,除非下一个或上一个 textField/textView 看不见。然后对前 textField 的关注不会改变,我仍然在这个文本字段中输入。当我现在手动滚动并出现目标下一个文本字段时,它神奇地成为第一响应者。这当然不是预期的行为。

所以我想在尝试将它们设置为第一响应者之前,我必须将表格视图滚动到相应的字段。但我无法完成这件事。

我已经尝试过使用 indexPathes

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

尽管 super-superview 是一个有效的(也是正确的)表格单元格,但返回的路径是 nil。我也尝试了一些变化

CGPoint point = [self.tableView convertPoint:textField.frame.origin toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];

以及 rects 和 indexPathsForRowsInRect 的其他变体。

唯一的方法是手动跟踪 textFields 单元格 indexPaths,但在这种情况下这不是合适的解决方案。

任何人都知道如何在tableView中实现滚动到看不见的textField?

编辑:

正如贾斯汀保尔森要求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];
}

正如我根据日志的输出所说,路径为零,而超级超级视图是正确的表视图单元

4

1 回答 1

3

感谢您尝试帮助我,我自己有一个解决方案。在我的keyboardControlsPreviousNextPressed我现在

[self.tableView scrollRectToVisible:((UIView *)textField).superview.superview.frame animated:YES];
[textField becomeFirstResponder];

这个解决方案似乎工作得很好。我遇到的唯一问题是有时新聚焦的 textField 被键盘隐藏,因此 tableViewController 不会自动调整。在大多数情况下,您还可以将该行滚动到顶部以规避这种情况。

NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
于 2012-06-21T08:18:43.370 回答