我正在使用这个其他 SO 答案将UITextField
s 添加到我UITableViewCell
的 s 中。但是,我现在不知道如何通过使用下一步按钮让用户专注于下一个项目。有什么提示吗?
4 回答
尝试tag
为每个 UITextField 分配一个。按下 Next 按钮后,计算下一个标签并用于[[UIView viewWithTag:nextTag] becomeFirstResponder]
将焦点更改到下一个文本字段。
这对我来说效果很好,但必须进行调整以满足您的需求:
#pragma mark - UITextField Delegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
HRCFormCell * currentCell = (HRCFormCell *) textField.superview.superview;
NSIndexPath * currentIndexPath = [self.tableview indexPathForCell:currentCell];
if (currentIndexPath.row != [self.questionsArray count] - 1) {
NSIndexPath * nextIndexPath = [NSIndexPath indexPathForRow:currentIndexPath.row + 1 inSection:0];
HRCFormCell * nextCell = (HRCFormCell *) [self.tableview cellForRowAtIndexPath:nextIndexPath];
[self.tableview scrollToRowAtIndexPath:nextIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
[nextCell.textField becomeFirstResponder];
}
return YES;
}
除了 Anh 发布的关于使用标签值查找下一个字段并使其成为 firstResponder 的内容之外......
如果您在 UITableView 中,您还需要记住,下一个 UITextField 可能不在屏幕上,甚至不在视图中,因为它可能位于屏幕底部下方。您可能需要将该新行滚动到视图中,然后才能使其成为第一响应者。我在以前的应用程序中为处理此问题所做的是使标记成为我可以用来暗示行的 NSIndexPath 的值,这样我就可以找出它在哪一行。然后你可以将该行滚动到视图中:
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
但是,这会产生一个竞争条件,当您调用 becomeFirstResponder 时,单元格还不可见,因此我会延迟 becomeFirstResponder 直到它可见。我将在我的类中设置一个值作为属性,例如行号,该字段应该成为第一响应者,然后在 cellForRowAtIndexPath 或 willDisplayCell:forRowAtIndexPath 中,当我要显示该单元格时,我会调用 becomeFirstResponder文本字段 THEN... 因为那样它就保证存在。
你愿意吗..
NSArray *arrayCells = [self.aTableView visibleCells];
UITableViewCell * currentCell = (UITableViewCell *) textField.superview.superview;
NSIndexPath * currentIndexPath = [self.aTableView indexPathForCell:currentCell];
if ((currentIndexPath.row != [arrayCells count] - 1) && (currentIndexPath.row < [arrayCells count]-1)) {
NSIndexPath * nextIndexPath = [NSIndexPath indexPathForRow:currentIndexPath.row + 1 inSection:0];
UITableViewCell * nextCell = (UITableViewCell *) [self.aTableView cellForRowAtIndexPath:nextIndexPath];
[self.aTableView scrollToRowAtIndexPath:nextIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
for (id object in nextCell.contentView.subviews) {
if ([object isKindOfClass:[UITextField class]]) {
UITextField *tf = object;
[tf becomeFirstResponder];
}
}