我有一个分组的表格视图,并尝试在用户点击输入时为文本字段设置新的第一响应者。
这对我来说并不是什么新鲜事,在我做出一些无关的更改之前我的代码工作了,现在却没有。当我设置第一个响应者时,我有一个指向正确文本字段的指针,没有任何反应。
焦点完全从任何文本字段消失,键盘停留在屏幕上。然后,输入和“隐藏键盘”键都会停止工作,直到用户再次重新开始对文本字段的聚焦为止。
以下是代码:
- (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;
}
}
}
答案 0 :(得分:0)
首先,我绝对会验证您的描述是否在您的代码“之前工作”并且更改“无关”。根据定义,您对工作代码所做的任何更改都会以某种方式导致它不再起作用。如果不是直接的,那么间接是由于副作用。
所有从我发布的代码示例中跳出来的是:
// adjust the table view offset to make sure the text field is visble
[self setTableViewOffsetForTextField:field];
您正在做正确的事情,确保包含textField的单元格滚动到视图中。一种可能性是当您将其滚动到视图中时创建单元格,这取决于代码的其余部分,可能会导致以下问题:
您发送becomeFirstResponder
的textField是与单元格中实际的textField不同的实例。
由于动画滚动带有textField的单元格进入视图,因此当您调用becomeFirstResponder
时尚未创建单元格。
我会撤消您所做的任何更改,以回到正常工作的版本,并确保在预期的时间发送正确的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中发出警告。
解决方案:
NSLog(@"%@", textField.field)
电话前加becomeFirstResponder
。检查日志。