2013-04-16 84 views
0

我有一个分组表格视图,并试图设置一个新的第一响应者到一个文本字段,当用户点击输入。急救员没有正确设置

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

焦点完全从任何文本字段中消失,并且键盘保持在屏幕上。然后,输入和“隐藏键盘”键都会停止,直到用户再次重新启动文本字段的焦点。

下面是代码:

- (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; 
      } 
     } 
    } 
+1

重点是什么?如果“没有任何反应”,你怎么能摆脱“焦点”?你有没有“无关的变化”以前的版本检查相同的设备/模拟器? –

+0

我的猜测是这个问题根本与这个代码无关。检查你的文本字段('ObjectEditField')代码中发生了什么。当'becomeFirstResponder'被调用时,它可能正在做些什么?也许它阻止了主线程?也许其他事情发生在其他领域成为第一响应者? – Sulthan

+0

它是否在模态视图控制器? – Sulthan

回答

0

首先,我绝对会验证您的以上描述,您的代码“工作之前”和改变,是“无关”。根据定义,对工作代码所做的任何更改都会导致其无法继续工作。如果不是直接的话,那么间接地由于副作用。

所有,在我从你贴的代码示例跳出是行:

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

你是做正确的事,确保包含该文本框的细胞滚动到视图。一种可能性是,当你把它的滚动到视图这取决于你的代码的其余部分,可能会导致一些问题,如小区创建:

  1. 文本字段您发送becomeFirstResponder到一个不同的实例比textField实际上在单元格中。

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

我会背出你发回去工作版本,真正确保正确的文本框在一个预期的时间发送becomeFirstResponder任何更改。

+0

唯一改变的是该文件将数据保存到字典而不是对象。没有其他改变。在我正在测试的这种情况下,我试图设置第一响应者的单元实际上仍然可见,并且没有滚动发生。 (他们是两个相邻的行)我同意某些事情必须改变。我只是不知道什么,因为唯一真正改变的是数据保存到哪里。 – JMD

0

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

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

此方法的默认实现返回控制是当视图控制器的模式呈现样式设置为UIModalPresentationFormSheet和其他演示文稿样式;否。因此,系统通常不允许键盘被模态形式解散。

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

那么,会发生什么?我们知道当前的文本字段会使第一响应者辞职,并且视图不会成为第一响应者,或者不可视视图成为第一响应者。

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

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

在这里,我们有型ObjectEditField

[field isKindOfClass:[UITextField class]] 

的对象现在,我们正在测试,如果该字段的UITextField一个子类。这是非常可疑。如果它是ObjectEditField,它怎么可能是UITextField呢?

让我们继续

UITextField *textField = (UITextField *)field; 

奥基,让我们假定它是一个UITextField

if (![textField.field isFirstResponder]) { 

再次,一些非常可疑。 A UITextField没有field属性。

所以:

[textField.field becomeFirstResponder]; 

被称为不明物体上。我们甚至不知道它是否为UITextField

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

解决方案:

  1. 清理你的代码,查警告。
  2. becomeFirstResponder之前拨打NSLog(@"%@", textField.field)。检查日志。