我在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的其他变体。
唯一的方法是手动跟踪textFields单元格索引路径,但在这种情况下这不是合适的解决方案。
任何人都知道如何在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];
}
正如我所说,根据日志的输出路径是nil,而super-superview是rught table view cell
答案 0 :(得分: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];