编辑UITextField
并按下返回后,我循环并检查下一个字段。我得到该字段的索引路径,然后保存它。接下来我重新加载表数据,当构建表时,如果indexPath
等于下一个文本字段的indexPath
,那么我将其设置为第一响应者。
我在正确的textField
和所有内容中抓取了正确的indexPath
,但第一响应者未设置。相反,焦点只是消失了。
我的代码:
//inside UITextFieldShouldReturn
for (int i = uiTextField.fieldTag + 1; i < group.fields.count; i++) {
ObjectEditField *field = [group.fields objectAtIndex:i];
if (field.propName && field.updateObjectOnEdit == YES && [field isKindOfClass:[ObjectEditTextField class]]) {
// set the active field
activeField = field;
// obtain a pointer to the textfield object and set it to be the first responder
ObjectEditTextField *textField = (ObjectEditTextField *)field;
if (![textField.field isFirstResponder]) {
UITableViewCell *cell = (UITableViewCell *)[[[uiTextField superview] superview] superview];
firstResponderIndexPath = [_fieldsTableView indexPathForCell:cell];
然后,当我在表格视图中调用firstResponderIndexPath
reloadData
后,在tableView:cellForRowAtIndexPath:
内调用if (firstResponderIndexPath.row + 1 == indexPath.row)
{
ObjectEditTextField *textField = (ObjectEditTextField *)field;
NSLog(@"display: %@", textField.field.text);
[textField.field becomeFirstResponder];
}
:
NSLog
{{1}}的输出是正确的,它应该是字段。但是第一响应者没有正确设置。
答案 0 :(得分:1)
如果视图是窗口视图层次结构的一部分,则只能设置第一个响应者。 “tableView:cellForRowAtIndexPath:”在添加之前被调用。因此,您必须在添加单元格后设置第一个响应者,例如在UITableViewController子类中调用reloadData之后:
[self.tableView reloadData];
MyTableCell *cell = (id)[self.tableView cellForRowAtIndexPath: firstResponderIndexPath];
[cell.myTextFieldProperty becomeFirstResponder];
答案 1 :(得分:0)
是否已将单元格添加到您呼叫becomeFirstResponder
的位置的窗口中?如果不是,就什么都不会发生。来自文档:
<强> becomeFirstResponder 强>
您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图将从任何层次结构中分离。
请尝试在tableView:willDisplayCell:forRowAtIndexPath:
中调用它。您还可以在所需的单元格上设置布尔属性,并让其在becomeFirstResponder
的字段上调用didMoveToSuperview
。