急救员没有正确设置
我有一个分组表格视图,并试图设置一个新的第一响应者到一个文本字段时,用户点击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该单元,根据代码的其余部分,可能会导致以下问题:
-
您正在发送的
becomeFirstResponder
一个becomeFirstResponder
的textField与实际在单元格中的textField不同。 -
当您调用
becomeFirstResponder
时,单元格还没有被创build,原因是将textField的单元格滚动到视图中进行animation滚动。
我会退出您所做的任何更改以返回到正在运行的版本,并确保正确的textField正在被发送到预期的时间。
通过评论,该领域是一个模态(呈现)控制器。
首先解释 – 默认情况下,如果模态控制器中的文本字段失去焦点,键盘不会被隐藏。 这是由方法控制-[UIViewController disablesAutomaticKeyboardDismissal]
当视图控制器的模态performance风格设置为UIModalPresentationFormSheet时,此方法的默认实现返回YES,其他呈现风格返回NO。 因此,系统通常不允许键盘被解除模态forms。
这解释了为什么键盘的行为方式。 没有文本字段的焦点,键盘不隐藏,因为我们是在一个模态控制器。
那么,会发生什么? 我们知道当前的文本字段会使第一响应者辞职,或者没有视图成为第一响应者,或者不可编辑的视图变成第一响应者。
那么,你整个代码看起来非常可疑:
ObjectEditField *field = [group.fields objectAtIndex:i];
这里我们有一个ObjectEditField
types的对象
[field isKindOfClass:[UITextField class]]
现在,我们正在testing,如果该字段是UITextField
的子类。 这是非常可疑的。 如果它是ObjectEditField
,它也可以是UITextField
?
让我们继续
UITextField *textField = (UITextField *)field;
奥基,我们假设这是一个UITextField
if (![textField.field isFirstResponder]) {
再次,一些非常可疑的事情。 UITextField
没有field
属性。
所以:
[textField.field becomeFirstResponder];
被称为一个未知的对象。 我们甚至不知道它是否是一个UITextField
。
请注意,大部分代码应该在IDE中发出警告。
解:
- 清理你的代码,检查警告。
- 放置一个
NSLog(@"%@", textField.field)
在becomeFirstResponder
调用之前。 检查日志。