0

编辑aUITextField并按下 return 后,我循环并检查下一个字段。我得到该字段的索引路径,然后保存它。接下来我重新加载表数据,并且在构建表时,如果indexPath等于indexPath下一个文本字段的值,那么我将其设置为第一响应者。

我在正确的地方抓住了正确textFieldindexPath一切,但是第一响应者没有得到设置。相反,焦点消失了。

我的代码:

//inside UITextFieldShouldReturn

for (int i = uiTextField.fieldTag + 1; i < group.fields.count; i++) {
ObjectEditField *field = [group.fields objectAtIndex:i];
     if (field.propName && field.updateObjectOnEdit == YES && [field isKindOfClass:[ObjectEditTextField class]]) {
        // set the active field
        activeField = field;

       // obtain a pointer to the textfield object and set it to be the first responder
         ObjectEditTextField *textField = (ObjectEditTextField *)field;
         if (![textField.field isFirstResponder]) {
         UITableViewCell *cell = (UITableViewCell *)[[[uiTextField superview] superview] superview];
         firstResponderIndexPath = [_fieldsTableView indexPathForCell:cell];

然后,一旦我firstResponderIndexPath调用reloadData了表格视图,在里面tableView:cellForRowAtIndexPath:我有:

if (firstResponderIndexPath.row + 1 == indexPath.row)
{
    ObjectEditTextField *textField = (ObjectEditTextField *)field;
    NSLog(@"display: %@", textField.field.text);
    [textField.field becomeFirstResponder];
}

的输出NSLog是正确的,并且应该是正确的字段。但是,第一响应者没有正确设置。

4

2 回答 2

1

如果视图是窗口视图层次结构的一部分,则只能设置第一响应者。“tableView:cellForRowAtIndexPath:”在添加之前被调用。因此,您必须在添加单元格后设置第一响应者,例如在您的 UITableViewController 子类中调用 reloadData 之后:

[self.tableView reloadData];
MyTableCell *cell = (id)[self.tableView cellForRowAtIndexPath: firstResponderIndexPath];
[cell.myTextFieldProperty becomeFirstResponder];
于 2013-04-26T19:33:25.713 回答
0

单元格是否已在您调用的位置添加到窗口中becomeFirstResponder?如果不是,什么都不会发生。从文档:

成为第一响应者

您可以调用此方法以使响应者对象(例如视图)成为第一响应者。但是,如果它是视图层次结构的一部分,您应该只在该视图上调用它。如果视图的 window 属性包含一个 UIWindow 对象,则它已安装在视图层次结构中;如果它返回 nil,则视图与任何层次结构分离。

尝试调用它tableView:willDisplayCell:forRowAtIndexPath:。您还可以在所需单元格上设置一个布尔属性,并让它becomeFirstResponderdidMoveToSuperview.

于 2013-04-26T19:33:38.153 回答