6

在我的应用程序中,每个单元格内都有一个UITabeViewwith UITextFields。但是,我在实现上一个/下一个按钮以使上一个/下一个内的文本字段UITableViewCell成为第一响应者时遇到了麻烦。

我已经对该UITableViewCell类进行了子类化,让它在按下 prev./next 按钮时调用它的某个方法,并将delegate单元格本身作为该方法的参数传递(所以我可以获取它的索引路径来计算哪个是索引必须将其文本字段设为第一响应者的单元格的路径)

在委托的方法I的实现中:

  • 获取按下按钮的单元格的索引路径
  • 从该单元格的索引路径中加或减 1(取决于按下的按钮)
  • -cellForRowAtIndexPath:使用表格视图上的方法获取其文本字段必须成为第一响应者的单元格
  • 使文本字段成为第一响应者

问题是该-cellForRowAtIndexPath:方法仅在单元格可见时才返回单元格。因此,当单元格不可见时,它将返回nil并且上述算法将不起作用,而当单元格在屏幕上时,它将正常工作。

这是我的上一个代码。按钮,前提是它MUInfoMateriaTableViewCell是我的子类UITableViewCell并且它具有textField返回其文本字段的属性:

- (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section];

    MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath];
    [newCell.textField becomeFirstResponder];
}

有什么方法可以“获取”一个不可见的单元格,以便我可以使其文本字段成为第一响应者?或者你能建议我另一种算法来解决这个问题吗?

4

3 回答 3

8

您可以通过多步骤过程解决此问题:

  • 跟踪包含所需文本字段的单元格以使第一响应者
  • 计算NSIndexPath要显示的单元格并调用[self.tableView scrollToRowAtIndexPath:atScrollPosition:animated:]以将其显示在视图中
  • 实现在所需单元格变得可见并且匹配所需单元格或索引路径时tableView:willDisplayCell:forRowAtIndexPath:调用它becomeFirstResponder

最后一步很重要,因为becomeFirstResponder如果接收者不是任何窗口的子视图,调用不会做任何事情。

于 2013-04-16T15:12:02.860 回答
4

通过滚动表格视图使单元格可见,使用scrollToRowAtIndexPath:atScrollPosition:animated:.

例如

- (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section];

    [self.tableView scrollToRowAtIndexPath:previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

    MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath];
    [newCell.textField becomeFirstResponder];
}
于 2013-04-16T15:09:45.980 回答
-1

问题是 -cellForRowAtIndexPath: 方法仅在单元格可见时才返回单元格。

那是因为当其行不可见时,该单元格不存在。UITableView 只保留绘制表格所需的那些单元格。这就是滚动表格时收到大量-tableView:cellForRowAtIndexPath:消息的原因——表格要求其数据源提供它没有的单元格。

如果您想使用当前的方法,您需要滚动表格,以便将要编辑的行变得可见,如 Gabriele Petronella 的回答所示。

于 2013-04-16T15:48:58.960 回答