2013-04-26 42 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