在UITableView中实现Prev./Next按钮,使第一响应者成为非可见单元格中的UITextField

Big*_*Lex 6 iphone uitableview first-responder ios

在我的应用我有一个UITabeViewUITextField每一个细胞里面秒.但是我在实现上一个/下一个按钮时遇到麻烦,使前一个/下一个文本字段UITableViewCell成为第一个响应者.

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

在委托方法I的实现中:

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

问题是该-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];
}
Run Code Online (Sandbox Code Playgroud)

有没有办法"获得"一个不可见的单元格,所以我可以让它的文本字段成为第一个响应者?或者你能建议我另一种解决这个问题的算法吗?

jsz*_*ski 8

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

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

最后一步很重要,因为becomeFirstResponder如果接收器不是任何窗口的子视图,则调用不会执行任何操作.