这比标题描述的更独特。
我在UITableView上动态显示了28个单元格。我选择动态地执行此操作,因为有很多,但我总是知道在加载时我会知道固定数量的行。
每个单元格上都有一个UITextField。
例如,当用户在第0行的UITextField上时,他们按下' Return'在键盘上,它是'标签'第1行中的UITextField。第2行,第3行的后续冲洗重复,依此类推。这很好用。但是,如果用户当前正在编辑的行在屏幕外滚动,则它不起作用。因此,例如,如果用户正在编辑第0行中的UITextField,则向下滚动UITableView以显示可见的显示行10-22作为任意示例,然后按下'返回'在键盘上,视图一直向上滚动,但第1行中的UITextField没有成为FirstResponder,键盘已经消失。
这是因为scrollToRowAtIndexPath
代码动画需要时间吗?为什么这当前不起作用,如何让它工作,以便当UITableView滚动时,顺序的下一个UITextField将成为FirstResponder?
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.tableView reloadData];
CGPoint textFieldOriginInTableView = [textField convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOriginInTableView];
NSLog(@"textFieldShouldReturn: %zd", indexPath.row);
if (indexPath.row < (self.categories.count - 1)) {
NSIndexPath *nextIndex = [NSIndexPath indexPathForRow:(indexPath.row+1) inSection:0];
[self.tableView scrollToRowAtIndexPath:nextIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
MyCustomCell *cell = (MyCustomCell *)[self.tableView cellForRowAtIndexPath:nextIndex];
[cell.categoryValue becomeFirstResponder];
}
else {
[self doneTapped:self];
}
return YES;
}
编辑:我忘了在上面的OP中提到当前检索的indexPath总是正确的。无论我在UITableView中滚动的位置,上面代码中的NSLog语句总是返回正确的IndexPath.row。
答案 0 :(得分:0)
在这种情况下,我会尝试跟踪nextIndexPath(属性或ivar),然后实现UITableViewDelegate协议的 - [tableView:willDisplayCell:forRowAtIndexPath:]方法,这样就可以检查正确的可见单元格。
另一种解决方案是当textField成为第一响应者时阻止用户在tableView上的交互。或者在滚动tableView时重新签名第一个响应者。这是一个更简单的解决方案,在我看来有更好的用户体验。