2017-01-06 21 views
0

UITableViewで指定された行を削除するクエリを作成しましたが、deleteRowsをUITableViewというスクロールで呼び出すと問題が発生するので、スクロールするのを防ぐ方法を教えてください。なぜそれが上にスクロールするのか!私はコードのリターン 後の最初のトップに下にスクロールし、それを強制する方法が、テーブルビューのスクロールと呼ばれてみてくださいUITableViewのデリータが上にスクロールする

FIRDatabase.database().reference().child("messages").child(self.roomId).observe(.childRemoved, with: {(snap) in 
     print("child Removed") 
     for msg in self.messageArray { 
      let message: NSDictionary = msg as! NSDictionary 
      let messageContent: [String: Any] = message as! [String: Any] 
      if messageContent["messageID"] as! String == snap.key { 
       let indexRemoved = self.messageArray.index(of: msg) 
       self.messageArray.remove(msg) 
       self.userArray.removeObject(at: indexRemoved) 
       let indexPath = IndexPath(row: indexRemoved, section: 0) 
       print(indexPath) 
       self.conversationTableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.none) 
       break; 
      } 
     } 
     }) 
+0

は、それは正確にあなたが望んでいるものではありませんが、あなたはすべてのループスコープで削除行をしてはならないかもしれません。クロージャの最初の行に配列を作成し、削除のindexpathを追加するだけです。ループの終了後、追加された配列で削除してください。 –

+0

違いは何ですか?私の問題の他にスクロールの変更は削除自体ではありません –

+0

ソースでスクロール関連の問題が見つかりませんでした。私は、cellForRowAt indexPathや他の場所でテーブル全体を更新してセルを設定するロジックがあると思われます。全体のコードを持つことは、他人が正確な原因を把握できることを意味します。 そして右。これは原因ではありませんが、UITableViewがループ内でdeleteRowsを1つずつ実行するコードは良くありません。 –

答えて

0

を削除するには、「estimatedHeightForのようなテーブルビューメソッドを使用していないことを確認してください。行削除後にテーブルビューをスクロールするための高さを計算します。もう1つのポイントは、テーブルのスクロールをしたくない場合は、テーブルビューから行を削除するときにreloadDataメソッドを使用しないでください。

すべてが良好ならば、特定の行を削除すると、テーブルビューは削除された行の空き領域を埋めるようにすべての行を上に移動します。

+0

私はestimatedHeightForRowAtとheightForRowAtの両方を使用してセルの自動サイズ変更を行います。削除するときに問題がある場合、削除後にテーブルビューに呼び出さないようにする方法は? とreloadDataのもう1つのポイント私は削除後にそれを呼び出さなかった –

+0

heightForRowAtを使ってもOKですが、estimatedHeightForRowAtはテーブルビューを自動的にスクロールします。実際にはなぜそれが起こるのか分かりませんが、今のところ私は言うことができますが、plzはestimatedHeightForRowAtを試してみませんでした。そして、出力は何ですか? –

0

簡単に修正できるコードにはいくつか問題があります。

何も前に、まず、第1の可視アイテムの現在のスクロール位置をつかむ(細胞所与は同じサイズである)

let savedIndex = myTableView.indexPathsForVisibleRows?.first 

次に行は配列から削除され、テーブルビューをリロードした後、あなたが別のオプション(変数の高さ)を必要とする場合は、使用することができ、それは

myTableView.scrollToRowAtIndexPath(savedIndex, atScrollPosition: .Top, animated: false) 

であった場所に戻ることができ

tableView.contentOffset.y; 

また、削除する行を見つけるために配列全体を反復処理する必要はありません。 Firebaseノードのデータがクラスとして配列に格納されていると仮定すると、Firebaseキーを各クラスのプロパティとして配列内に配列の要素のインデックスを取得して削除するだけです。ここでは、このオブジェクトは次のようになりますオプション

let key = snapshot.key 

if let index = self.myArray.indexOf({$0.firebaseKey == key}) { 
    self.myArray.removeAtIndex(index) 
    self.myTableView.reloadData() 
} 

です:

class MyClass { 
    var firebaseKey: String? 
    var some_var: String? 
    var another_var: String? 
} 
関連する問題