2017-01-12 97 views
0

對於清晰度,我有一個UIView Controller,頂視圖中包含textfield。我也有一個tableview下面,每行包含1 textfield如何重新加載所有tableview單元格,同時編輯tableview單元格中的文本字段 - iOS Swift

問題:當我"didEndEditing"任何文本字段這意味着在頂視圖和在桌面視圖中的我想保存這些信息到核心數據並重新加載tableview

這很好用,EXCEPT!當我選擇一個文本字段(任何地方)時,輸入一個值,然後從一個文本字段中選擇,選擇另一個文本字段。這會導致鍵盤卡住,永遠不會消失。

我已經確診,這是因爲當"DidEndEditing"叫我失去參考我剛剛選擇的文本框(衛生組織鍵盤上),由於細胞被重新加載。

有沒有人遇到過這個?有沒有人找到一個優雅的解決方案,重新加載數據到tableview cell,同時選擇其中textfield

編輯:我曾嘗試移動reloadData()"DidBeginEditing"功能的文本框,並順利拿到了選擇指示器出現,但再次在鍵盤上沒有參考,即使我叫成爲第一個響應的tableView.relaodData()

+0

嘗試在鍵盤彈起而不是加載到UItextField委託上時重新加載數據。 設置鍵盤打開和關閉的觀察者。 –

回答

1

我會避免重新加載表視圖,以免打擾您的文本的第一響應者狀態。您可以(1)僅插入和刪除已更改的內容或(2)重新整理需要更新的單元。

1.插入和刪除

所以,而不是調用myTableView.reloadData(),找出路徑需要添加或刪除並調用適當的方法哪個索引。

myTableView.insertRows(at: newIndexPaths, with: .automatic) 
myTableView.deleteRows(at: oldIndexPaths, with: .automatic) 

2.重新裝修

這需要一個更加模塊化的方法,你是如何離隊的細胞。相反,這樣做的:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 
    cell.data = dataArray[indexPath.row] 
    return cell 
} 

這樣做:以後你

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 
    decorate(cell, at: indexPath) 
    return cell 
} 

func decorate(_ cell: UITableViewCell, at indexPath: IndexPath) { 
    cell.data = dataArray[indexPath.row] 
} 

這樣可以重新裝修,即更新單元格的內容和配置,而無需重新加載擾亂了第一個響應狀態:

for cell in myTableView.visibleCells { 
    if let indexPath = myTableView.indexPath(for: cell) { 
     decorate(cell: cell, at: indexPath) 
    } 
} 
+0

問題是所有文本字段的佔位符文本都依賴於所有其他文本字段,因此relaodData()是CRUCIAL功能。我可以做到這一點,所以所有帶有空文本字段的單元格都會重新加載,但這不會幫助我的問題,因爲用戶可能會選擇其中一個並面臨相同的錯誤。 – Jerland2

+0

聽起來更像是佔位符文本依賴於數據模型中的數據,而不一定依賴於視圖本身。觀點不應該被用作真相的來源,它應該全部來自模型。你可以重構構造這個佔位符文本不同嗎? –

+0

嗯......你是正確的,當前每當textfield「didEndEditing」將數據保存到我的dataModel,然後重新加載tableview來更新佔位符文本。如果有另一種方法來更新每個單元格佔位符文本沒有tableView.relaodData()請分享? – Jerland2

0

您是否嘗試在重新加載tableview之前存儲indexpath並使用它來查找您的單元格,並將其中的textfield設置爲重載後的第一響應者?

+0

我有一個解決方案使用此方法之前,但它是80%正確的,因爲有這種情況下,我只是打開視圖 - >輸入文本到topView文本框,然後去在tableview中選擇一個文本框,這錯誤發生。一旦在tableview中選擇了一個文本框,那麼該解決方案就可以完美工作。但是,第一個邊緣案例仍然是它的錯誤。 – Jerland2

+0

這個問題是,當我在tableview單元格中選擇該文本字段時,我的editingDidBegin不會被調用 – Jerland2

+0

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([indexPath row] ==((NSIndexPath *)[[tableView indexPathsForVisibleRows] lastObject])。row){ //加載結束 //例如[activityIndi​​cator stopAnimating]; } }將此代碼添加到您的代碼中,並確保將您的textField設置爲第一響應者 –

相關問題