第一响应者未正确设置

时间:2013-04-16 16:04:11

标签: ios objective-c ipad

我有一个分组的表格视图,并尝试在用户点击输入时为文本字段设置新的第一响应者。

这对我来说并不是什么新鲜事,在我做出一些无关的更改之前我的代码工作了,现在却没有。当我设置第一个响应者时,我有一个指向正确文本字段的指针,没有任何反应。

焦点完全从任何文本字段消失,键盘停留在屏幕上。然后,输入和“隐藏键盘”键都会停止工作,直到用户再次重新开始对文本字段的聚焦为止。

以下是代码:

- (void)uiTextFieldShouldReturn:(ObjectEditTextField *)uiTextField
 {
        if ((group.fields.count - 1) > uiTextField.fieldTag) 
        {

       //loop through every table group
        for (int i = uiTextField.fieldTag + 1; i < group.fields.count; i++) {

            //get whatever field is in the row (not necessarily a text field)

            ObjectEditField *field = [group.fields objectAtIndex:i];

            // a check if the field is of type UITextField
            if (field.propName && field.updateObjectOnEdit == YES && [field isKindOfClass:[UITextField class]]) {
                // set the active field
                activeField = field;

                // adjust the table view offset to make sure the text field is visble
                [self setTableViewOffsetForTextField:field];

                // obtain a pointer to the textfield object and set it to be the first responder
                UITextField *textField = (UITextField *)field;
                NSLog(@"field %@", textField.fieldLabel);
                if (![textField.field isFirstResponder]) {

                    [textField.field becomeFirstResponder];
                    return; 
                }
                break;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

首先,我绝对会验证您的描述是否在您的代码“之前工作”并且更改“无关”。根据定义,您对工作代码所做的任何更改都会以某种方式导致它不再起作用。如果不是直接的,那么间接是由于副作用。

所有从我发布的代码示例中跳出来的是:

// adjust the table view offset to make sure the text field is visble
[self setTableViewOffsetForTextField:field];

您正在做正确的事情,确保包含textField的单元格滚动到视图中。一种可能性是当您将其滚动到视图中时创建单元格,这取决于代码的其余部分,可能会导致以下问题:

  1. 您发送becomeFirstResponder的textField是与单元格中实际的textField不同的实例。

  2. 由于动画滚动带有textField的单元格进入视图,因此当您调用becomeFirstResponder时尚未创建单元格。

  3. 我会撤消您所做的任何更改,以回到正常工作的版本,并确保在预期的时间发送正确的textField becomeFirstResponder

答案 1 :(得分:0)

通过注释,该字段位于模态(呈现)控制器内。

首先解释 - 默认情况下,如果模态控制器中的文本字段失去焦点,则不会隐藏键盘。这由方法-[UIViewController disablesAutomaticKeyboardDismissal]

控制
  

当视图控制器的模式表示样式设置为UIModalPresentationFormSheet并且其他表示样式返回NO时,此方法的默认实现返回YES。因此,系统通常不允许键盘被解雇为模态形式。

这解释了为什么键盘的行为方式。没有文本字段被聚焦,键盘不会被隐藏,因为我们在模态控制器内。

那么,会发生什么?我们知道当前的文本字段会占用第一个响应者,并且没有视图成为第一响应者或不可编辑的视图成为第一响应者。

嗯,整个代码看起来很可疑:

ObjectEditField *field = [group.fields objectAtIndex:i];

这里我们有一个ObjectEditField

类型的对象
[field isKindOfClass:[UITextField class]]

现在,我们正在测试,如果该字段是UITextField的子类。那非常可疑。如果是ObjectEditField,它也可以是UITextField吗?

让我们继续

UITextField *textField = (UITextField *)field;

哦,我们假设它是UITextField

if (![textField.field isFirstResponder]) {

同样,非常可疑的东西。 UITextField没有field属性。

所以:

[textField.field becomeFirstResponder];

在未知对象上调用。我们甚至不知道它是UITextField

请注意,大多数代码都应在IDE中发出警告。

解决方案:

  1. 清理代码,检查警告。
  2. NSLog(@"%@", textField.field)电话前加becomeFirstResponder。检查日志。