2013-04-26 70 views
0

编辑完UITextField并按下返回后,我循环并检查下一个字段。我得到该字段的索引路径,然后保存它。接下来,我重新加载表格数据,并且在建表时,如果indexPath等于下一个文本字段的indexPath,那么我将它设置为第一响应者。firstResponder没有设置

我抓住正确的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的输出是否正确,它应该是。然而,第一响应者没有正确设置。

+0

请不要再次创建相同的问题。 – Sulthan 2013-04-26 19:38:58

回答

1

如果视图是窗口视图层次结构的一部分,则只能设置第一个响应者。 “tableView:cellForRowAtIndexPath:”在添加之前被调用。因此,您必须在添加单元格后设置第一个响应者,例如你打电话reloadData后您的UITableViewController子类:

[self.tableView reloadData]; 
MyTableCell *cell = (id)[self.tableView cellForRowAtIndexPath: firstResponderIndexPath]; 
[cell.myTextFieldProperty becomeFirstResponder]; 
+0

这个解决方案也没有工作。 – JMD 2013-04-26 19:53:01

+0

becomeFirstResponder的结果是什么?是或否? – lassej 2013-04-26 20:08:07

+0

return是NO – JMD 2013-04-26 20:11:33

0

具有信元被添加到你在哪里调用becomeFirstResponder点的窗口?如果不是的话,什么都不会发生。从文档:

becomeFirstResponder

您可能会调用该方法做出响应者的物体,如视图中的第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含一个UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则该视图将从任何层次结构中分离出来。

尝试在tableView:willDisplayCell:forRowAtIndexPath:中调用它。您也可以在所需的单元格上设置一个布尔属性,并在didMoveToSuperview的字段中调用becomeFirstResponder

+0

我移动如果检查到你提到的方法,但没有骰子。同样的效果正在发生。 – JMD 2013-04-26 19:38:24

+0

你尝试过使用单元格的“didMoveToSuperview”吗? – jszumski 2013-04-26 19:39:18

+0

你如何使用单元格的didMoveToSuperview? – JMD 2013-04-26 19:42:16