UITableView scrollToRowAtIndexPath 有时只滚动
Posted
技术标签:
【中文标题】UITableView scrollToRowAtIndexPath 有时只滚动【英文标题】:UITableView scrollToRowAtIndexPath only scrolls sometimes 【发布时间】:2011-04-25 21:58:13 【问题描述】:我有一个带有几个 UITableViewCells 的 UITableView,这些单元格内是 UITextFields。我实现了一个 UIToolbar 用于在不同的文本字段之间切换。我可以转到下一个单元格中的下一个文本字段或上一个文本字段。这可以正常工作,直到单元格成为当前在 tableview 中不可见的第一响应者。
我发现了
[self.tableview cellForRowAtIndexPath:indexPath]
返回nil
并且手动滚动到带有文本字段的单元格,它应该成为第一响应者,消除了问题。因此,我尝试滚动到单元格,然后再将其更改为第一响应者。
我试过了
[[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
但不幸的是,tableview 不会滚动到这个单元格,而是滚动到所有其他单元格。当我在这一行添加断点时,问题不会发生。看起来表格视图正在滚动到单元格,但随后又向下滚动。
这里是cellForRowAtIndexPath的代码:
UITableViewCell *cell;
static NSString *AttributeCellIdentifier = @"AttributeCellIdentifier";
cell = [tableView dequeueReusableCellWithIdentifier:AttributeCellIdentifier];
if (cell == nil)
[[NSBundle mainBundle] loadNibNamed:@"AttributeCell" owner:self options:nil];
cell = attributeCell;
self.attributeCell = nil;
UITextField * textField = (UITextField *)[cell viewWithTag:1];
[textField setKeyboardType:UIKeyboardTypeDecimalPad];
[textField setInputAccessoryView:[self inputAccessoryView]];
UITextField * textField;
textField = (UITextField *)[cell viewWithTag:1];
textField.placeholder = @"C(Probe)/mol/l";
return cell;
这是切换到上一个文本字段的代码:
UIView * currentResponder = [self.view findFirstResonder];
UITextField * newFocusTextField;
UITableViewCell * cell = (UITableViewCell*)[[currentResponder superview] superview];
NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
newFocusTextField = (UITextField*)[[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]] viewWithTag:1];
[currentResponder resignFirstResponder];
[newFocusTextField becomeFirstResponder];
UITableViewCell * newCell = (UITableViewCell*)[[newFocusTextField superview] superview];
NSIndexPath * newIndexPath = [self.tableView indexPathForCell:newCell];
[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
希望这会有所帮助。
【问题讨论】:
请贴出 cellForRowAtIndexPath 的代码。这个方法的内容你写了吗?如果是这样,为什么它返回零?如果没有,为什么不呢? 我写了那个代码,我认为它返回 nil 因为滚动不起作用时单元格不可见。来自 cellForRowAtIndexPath 的文档:表示表格单元格的对象,如果单元格不可见或 indexPath 超出范围,则为 nil。 当您点击工具栏以显示/编辑文本字段时,它是如何实现的?我想知道这里是否存在排序问题,即您可能需要滚动表格以先显示单元格,然后使其成为第一响应者。 @Mike - 我明白你的意思,我试过了,但这并不能解决问题。 【参考方案1】:您帖子上的代码和问题定义不是百分百清楚,但滚动方法在适用于 ios 3.0 时存在错误/故障(据我记忆,我想特别是 3.0)。我无法弄清楚它发生的原因,但它一直在崩溃,虽然对于 iOS 4.x 来说还可以。
修复是添加一个
[table reloadData]
在滚动线之前。我知道这没有意义,而且我知道这不是一个好习惯,特别是如果单元格渲染很昂贵,但它确实解决了这种情况下的问题。我不知道你的问题是否源于同一个问题,但你可以试一试......
【讨论】:
我很害怕,但这并不能解决我的问题。我将编辑我的问题以更清楚地解释我的问题。【参考方案2】:我尝试了几种想法,现在一切正常。我删除了:
[currentResponder resignFirstResponder];
删除该行后,tableview 滚动正常,我可以使用 newFocusTextField 直接将指针设置到新单元格并使其成为 firstResponder :
[newFocusTextField becomeFirstResponder];
我有一个可以正常使用的 nextTextField 方法
[currentResponder resignFirstResponder];
所以我不太明白为什么会出现问题,但我认为滚动到单元格然后设置新的 firstResponder 比先退出 currentResponder 更好。
谢谢你的帮助;)
【讨论】:
以上是关于UITableView scrollToRowAtIndexPath 有时只滚动的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView
如何与重叠显示的 UITableView 交互另一个 UITableView