[英]How to reload all tableview cells, while editing a textfield in a tableview cell - iOS Swift
對於 Clarity,我有一個UIView Controller
,其頂視圖包含一個textfield
。 我下面還有一個tableview
,每行包含 1 個textfield
。
問題:當我"didEndEditing"
任何文本字段時,這意味着頂部視圖中的文本字段和表視圖中的文本字段,我想將此信息保存到核心數據並重新加載tableview
。
這完美地工作,除了! 當我選擇一個文本字段(任何地方)時輸入一個值,然后從一個文本字段中被選中,選擇另一個文本字段。 這會導致鍵盤卡住並且永遠不會消失。
我已經診斷出這是因為當"DidEndEditing"
被調用時,由於單元格被重新加載,我失去了對我剛剛選擇的文本字段的引用(誰的鍵盤已啟動)。
有沒有人遇到過這個? 有沒有人找到一個優雅的解決方案來在選擇其中的textfield
時將數據重新加載到tableview cell
?
編輯:我嘗試將reloadData()
移動到"DidBeginEditing"
的"DidBeginEditing"
函數,並成功地讓選擇指示器出現,但鍵盤再次沒有參考,即使我在tableView.relaodData()
之后調用成為第一響應者tableView.relaodData()
我會完全避免重新加載表格視圖,以免打擾文本的第一響應者狀態。 您可以 (1) 僅插入和刪除更改的內容或 (2) 重新裝飾需要更新的單元格。
因此,與其調用myTableView.reloadData()
, myTableView.reloadData()
找出需要添加或刪除哪些索引路徑並調用適當的方法。
myTableView.insertRows(at: newIndexPaths, with: .automatic)
myTableView.deleteRows(at: oldIndexPaths, with: .automatic)
這需要一種更加模塊化的方法來處理如何使單元出列。 而不是這樣做:
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)
}
}
您是否嘗試過在重新加載 tableview 之前存儲 indexpath 並使用它來查找單元格並在重新加載后將其中的文本字段設置為第一響應者?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.