急救员没有正确设置

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

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

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

这里是代码:

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

首先,我会绝对validation你的描述,你的代码“以前工作”和变化是“不相关的”。 您对工作代码所作的任何修改,在某种程度上,都会导致工作代码无法继续工作。 如果不是直接的,那么间接地由于副作用。

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

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

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

  1. 您正在发送的becomeFirstResponder一个becomeFirstResponder的textField与实际在单元格中的textField不同。

  2. 当您调用becomeFirstResponder时,单元格还没有被创build,原因是将textField的单元格滚动到视图中进行animation滚动。

我会退出您所做的任何更改以返回到正在运行的版本,并确保正确的textField正在被发送到预期的时间。

通过评论,该领域是一个模态(呈现)控制器。

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

当视图控制器的模态performance风格设置为UIModalPresentationFormSheet时,此方法的默认实现返回YES,其他呈现风格返回NO。 因此,系统通常不允许键盘被解除模态forms。

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

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

那么,你整个代码看起来非常可疑:

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

这里我们有一个ObjectEditFieldtypes的对象

 [field isKindOfClass:[UITextField class]] 

现在,我们正在testing,如果该字段是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调用之前。 检查日志。