【问题标题】:UITableView scrollToRowAtIndexPath not working for last 4UITableView scrollToRowAtIndexPath 对最后 4 个不起作用
【发布时间】:2011-09-15 07:11:25
【问题描述】:

我在 UITableViewController 中,并且在单元格中有文本字段。当用户单击文本字段时,我实现 UITextFieldDelegate 并在方法 textFieldDidBeganEditing 中确定单元格的索引并滚动到该位置。它适用于最后 4-5 个单元格的所有单元格。我究竟做错了什么?谢谢。

【问题讨论】:

  • 您是否有单独的文本字段引用,或者您是否将其添加到您的 cellForRowAtIndexPath: 方法中?
  • 请提供您的实现以确定单元格的 indexPath。

标签: objective-c ios cocoa-touch uitableview scrollto


【解决方案1】:

scrollToRowAtIndexPath: 方法仅在 tableView 的 contentSize 足够大时将单元格滚动到 UITableViewScrollPositionTopUITableViewScrollPositionMiddle将细胞带到这些位置。如果您尝试滚动到顶部或中间的单元格是最后一个单元格或在最后几个单元格中,则无法滚动到中间或顶部。在这些情况下,您需要为这些单元格手动计算 contentOffset

编辑 - 计算 contentOffset:

为了计算 contentOffset,请使用@Schoob 指定的方法。将以下代码放入您的 textFieldDidBeginEditing 方法中。

CGPoint origin = textField.frame.origin;
CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];
float navBarHeight = self.navigationController.navigationBar.frame.size.height;
CGPoint offset = tableView.contentOffset;   
// Adjust the below value as you need
offset.y += (point.y - navBarHeight);
[tableView setContentOffset:o animated:YES];

【讨论】:

  • 感谢您的回答。我认为这就是原因,但你能举例说明我将如何计算新的内容偏移量吗?再次感谢!
  • 为什么使用 offset.y += (point.y - navBarHeight) 而不是 offset.y = (point.y - navBarHeight)。
【解决方案2】:

我发现使用 scrollToRowAtIndexPath 的关键是确保在呈现视图后调用它。 IE。推送到导航控制器或以模态方式呈现。

我的工作代码是这样的

调用代码

MyViewController *cont = [[MyViewController alloc] initWithMedication:medication];
cont.sectionToShow = 1;
[self.navigationController pushViewController:cont animated:YES];

[cont release];

viewWillAppear 中的视图控制器代码

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:self.sectionToShow];
[cont.tableview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

如果我以其他任何方式进行操作,总会有一些边缘情况不起作用。我想我们想在演示周期的后期滚动。

【讨论】:

  • 是的,我从 -viewDidLoad 调用 -scrollToRowAtIndexPath 的策略行不通。
【解决方案3】:

这是您在尝试确定添加到 UITableViewCell 上的视图/文本字段的 indexPath 时应该使用的内容

CGPoint point = [textField.superview convertPoint:textField.frame.origin toView:self.tableView];

然后用point with

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];

【讨论】:

  • 问题是关于如何滚动最后几行。使用这种技术获取索引路径是可以的,但是问题依然存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多