0

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

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

焦点完全从任何文本字段中消失,键盘留在屏幕上。然后 enter 和 'hide keyboard' 键都停止工作,直到用户再次重新启动对文本字段的关注。

这是代码:

- (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;
            }
        }
    }
4

2 回答 2

0

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

从您发布的代码示例中跳出来的所有内容都是以下行:

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

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

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

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

我会取消您为返回工作版本所做的任何更改,并真正确保becomeFirstResponder在预期的时间发送正确的 textField。

于 2013-04-16T16:15:45.083 回答
0

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

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

此方法的默认实现在视图控制器的模态呈现样式设置为 UIModalPresentationFormSheet 时返回 YES,而对于其他呈现样式返回 NO。因此,系统通常不允许为模态表单关闭键盘。

这解释了为什么键盘的行为方式如此。没有文本字段被聚焦,键盘也没有被隐藏,因为我们在一个模态控制器中。

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

好吧,你的整个代码看起来很可疑:

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

这里我们有一个类型的对象ObjectEditField

[field isKindOfClass:[UITextField class]]

现在,我们正在测试该字段是否是UITextField. 这是非常可疑的。如果是ObjectEditField,它怎么可能UITextField也是?

让我们继续

UITextField *textField = (UITextField *)field;

好吧,让我们假设它是一个UITextField

if (![textField.field isFirstResponder]) {

再次,非常可疑的事情。AUITextField没有field财产。

所以:

[textField.field becomeFirstResponder];

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

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

解决方案:

  1. 清理你的代码,检查警告。
  2. 在通话NSLog(@"%@", textField.field)前放一个。becomeFirstResponder检查日志。
于 2013-04-16T19:13:35.100 回答