我在this thread尝试了一些解决方案,但我遇到了麻烦。我的表是使用plist中的数据动态加载的,因此我无法在storyboard中创建从一个单元到另一个单元的连接。我实现了一个名为DSCell的自定义UITableViewCell类,它在单元格的右侧有两个DSTextField对象。当在最左边的DSTextField上输入时,它成功地将焦点转移到下一个字段。但是,当在右侧文本字段中输入时,它应该将焦点移动到下一个单元格中的文本字段(向下一行)。但事实并非如此。
单元格中的文本字段包含标记2和3.
这是我的cellForRowAtIndex方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"PaperCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
NSString *text = [_paper objectAtIndex:indexPath.row];
UILabel *label = (UILabel *)[cell viewWithTag:1];
label.text = text;
// Set the "nextField" property of the second DSTextfield in the previous cell to the first DSTextField
// in the current cell
if(indexPath.row > 0)
{
DSCell *lastcell = (DSCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]];
DSTextField *lastField = (DSTextField *)[lastcell viewWithTag:3];
DSTextField *currentField = (DSTextField *)[cell viewWithTag:2];
lastField.nextField = currentField;
}
return cell;
}
这是textFieldShouldReturn方法:
- (BOOL) textFieldShouldReturn:(UITextField *) textField {
DSTextField *field = (DSTextField *)textField;
UIResponder *responder = field;
[responder resignFirstResponder];
responder = field.nextField;
[responder becomeFirstResponder];
return YES;
}
目前我正在尝试在调用cellForRowAtIndexPath时将第二个DSTextField的nextField属性设置为当前单元格,但它似乎不起作用。我从第1行开始尝试检索上一行中的单元格,然后将最右边的文本字段的nextField属性分配给当前单元格中最左边的文本字段。
有更好的方法吗?我不希望每个文本字段都有不同的标签,并且这样做,这可能会变得混乱。
答案 0 :(得分:1)
我建议您只尝试找到正确的单元格,将焦点转移到textFieldShouldReturn:
方法中。可能导致您出现问题的一件事是您可能要求单元格是不可见的lastCell
,然后由tableview处理(因此nextField
无效)。< / p>
更改事物返回时发生的逻辑(您仍然希望在一行中的两个单元格之间设置nextField
):
- (BOOL) textFieldShouldReturn:(UITextField *) textField {
//This isn't necessary: UIResponder *responder = field;
//Or this: [responder resignFirstResponder];
//Check if it's the left or right text field
if (textField.tag == 3) {
//Find the cell for this field (this is a bit brittle :/ )
UITableViewCell *currentCell = textField.superview.superview;
NSIndexPath *ip = [self.tableView indexPathForCell:currentCell];
if (ip.row < [self.tableView numberOfRowsInSection:ip.section] - 1) {
DSCell *nextCell = (DSCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:ip.row+1 inSection:ip.section]];
[[nextCell viewWithTag:2] becomeFirstResponder];
}
}
return YES;
}