UITableView scrollToRowAtIndexPath不适用于最后4

时间:2011-06-15 07:00:23

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

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

3 个答案:

答案 0 :(得分:35)

仅当 tableView的contentSize 足够大时,

scrollToRowAtIndexPath:方法才会将单元格滚动到 UITableViewScrollPositionTop UITableViewScrollPositionMiddle 将细胞带到那些位置。如果您尝试滚动到顶部或中间的单元格是最后一个单元格或最后几个单元格,则无法滚动到中间或顶部。在这些情况下,您需要手动为这些单元格计算 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];

答案 1 :(得分:3)

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

我的工作代码是这样的

致电代码

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

[cont release];

viewWillAppear中的Viewcontroller代码

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

如果我以任何其他方式做到这一点,总会出现无法正常工作的边缘情况。我想我们想在演示周期的后期滚动。

答案 2 :(得分:-1)

这是您在尝试确定在UITableViewCell上添加的view / textField的indexPath时应该使用的内容

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

然后使用点

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