firstResponder没有设置

时间:2013-04-26 19:24:04

标签: ios objective-c uitableview first-responder

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

我在正确的textField和所有内容中抓取了正确的indexPath,但第一响应者未设置。相反,焦点只是消失了。

我的代码:

//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

{{1}}的输出是正确的,它应该是字段。但是第一响应者没有正确设置。

2 个答案:

答案 0 :(得分:1)

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

[self.tableView reloadData];
MyTableCell *cell = (id)[self.tableView cellForRowAtIndexPath: firstResponderIndexPath];
[cell.myTextFieldProperty becomeFirstResponder];

答案 1 :(得分:0)

是否已将单元格添加到您呼叫becomeFirstResponder的位置的窗口中?如果不是,就什么都不会发生。来自文档:

  

<强> becomeFirstResponder

     

您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图将从任何层次结构中分离。

请尝试在tableView:willDisplayCell:forRowAtIndexPath:中调用它。您还可以在所需的单元格上设置布尔属性,并让其在becomeFirstResponder的字段上调用didMoveToSuperview