2017-01-12 11 views
0

透明性のために私はを含むUIView Controllerのトップビューを持っています。私はまたtableviewを持っていて、各行は1 textfieldを含んでいます。テーブルビューセル内のテキストフィールドを編集中に、すべてのテーブルビューセルを再読み込みする方法 - iOS Swift

問題:私はテキストフィールドのいずれかを"didEndEditing"すると、これは、トップビューの1、私はコアデータにこの情報を保存し、tableviewをリロードしたいテーブルビュー内のものを意味します。

これは完全に動作します。例外があります。テキストフィールド(任意の場所)を選択すると値を入力し、あるテキストフィールドで選択されてから別のテキストフィールドを選択します。これにより、キーボードが詰まって決して消えません。 が呼び出されたときに、セルがリロードされたために選択したテキストフィールド(キーボードがアップしています)への参照が失われたためです。

誰もこれまでに遭遇したことはありますか?誰でも、tableview cellにデータを再ロードするための洗練された解決策を見つけて、その中にtextfieldを選択しましたか?

編集:私は、テキストフィールドのreloadData()から"DidBeginEditing"機能を動かしてみました、そして首尾よく表示される選択インジケータを得たが、再びキーボードは私がtableView.relaodData()

+0

UItextField Delegateで読み込むのではなく、キーボードがアップしているときにデータを読み込んでみます。 キーボードを開いて閉じるためにオブザーバーを設定します。 –

答えて

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) 
    decorate(cell, at: indexPath) 
    return cell 
} 

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

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

はこれを実行します。代わりにこれを行うには

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

+0

問題は、すべてのテキストフィールドのプレースホルダテキストが他のすべてのテキストフィールドに依存しているため、relaodData()がCRUCIALです。私は空のテキストフィールドを持つすべてのセルがリロードされるようにすることができますが、ユーザーがそれらの1つを選択して同じバグに直面する可能性があるので、それは私の問題を助けません。 – Jerland2

+0

プレースホルダテキストがデータモデルのデータに依存するように聞こえるようになります。必ずしもビュー自体ではありません。ビューは真実の源として使われるべきではなく、モデルからすべてが得られるはずです。このプレースホルダテキストを別にリファクタリングすることができますか? –

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええん、 tableView.relaodData()を使用せずにすべてのセルのプレースホルダテキストを更新する別の方法がある場合はどうぞ? – Jerland2

0
後にファーストレスポンダになって呼び出した場合でも、一切の参照を持っていませんでした

あなたはテーブルビューを再ロードする前にインデックスパスを保存して、あなたのセルを見つけ出し、リロード後に最初のレスポンダとしてその中のテキストフィールドを設定するのに使ってみましたか?

+0

私は前にこのメソッドを使用してソリューションをgottanているが、それは私がビューを開くjsut場合があるという点で、80%正確である - >そして、上面図のテキストフィールドにテキストを入力テーブルビューでテキストフィールドを選択するために行くと、これはバグが発生します。テキストフィールドは、テーブルビューで選択されると、その解決策は完璧に動作します。しかし、その最初の辺のケースはまだそれをバグにするものです。 (のUITableView *)のtableView willDisplayCell:(UITableViewCellの*)細胞forRowAtIndexPath:(NSIndexPath *)indexPath {(無効)のtableView - – Jerland2

+0

これに伴う問題は、私はテーブルビューセル – Jerland2

+0

でそのテキストフィールドを選択したときに、私のeditingDidBeginが呼び出されません、です if([indexPath row] ==((NSIndexPath *)[[tableView indexPathsForVisibleRows] lastObject])行){ //ローディング終了 //たとえば[activityIndi​​cator stopAnimating]; } }これをコードに追加し、最初のレスポンダとしてtextFieldを設定してください。 –

関連する問題