2017-05-11 3 views
0

これは長いものですので、私はあなたの時間を感謝します!私はUITableViewの特定のセクションで行を並べ替えることに問題があります。Swift - 1つのtableViewセクション内で行を移動すると、他のセクションのヘッダーが再ロードされます

コンテキスト:私は、複数のセクションを持つUITableView(.plainスタイル)を持っています。セクション0には多くの情報が表示されます。セクション1は、いくつかのコンテンツが好きなユーザーのリストです。セクション2は、いくつかのコンテンツを嫌っているユーザーの別のリストです。セクション3は、ユーザーによって生成されたコメントのリストです。表の各セルとヘッダービューは、ペン先から開始されたカスタムクラスです。私は、ユーザーが人気に基づいてコメントを並べ替えることを許可します。ユーザーがソートボタンをタップすると、次の関数が呼び出されます。

func sortOnPopular() { 

    if self.comments.isEmpty { 
     return 
    } 

    self.table.scrollToRow(at: IndexPath(row: 0, section: self.COMMENT_SEC), at: .top, animated: true) 

    //FIREBASE method 
    //returns a child from a node on the database that is sorted 
    //according to the parameter passed to it. The function returns 
    //each child one by one according to its rank in the sort. 
    _ = ref.child("not really important...").queryOrdered(byChild: "not important also").observe(.childAdded, with: { (snapshot) in 

     //Gets the index, i, of the sorted comment in the model, keys. 
     if let i = self.keys.index(of: snapshot.key) { 
      self.table.beginUpdates() 
      self.table.moveRow(at: IndexPath(row:i, section: self.COMMENT_SEC), to: IndexPath(row:0, section:self.COMMENT_SEC)) 
      self.keys.remove(at: i) 
      self.keys.insert(snapshot.key, at: 0) 
      self.table.endUpdates() 
     } 
    }) 
} 

問題:私はテーブルビュー内の1つのセクションを持っていたとき、美しく働くために使用このコード。一度複数を追加すると、テーブルビューはこの関数が呼び出されたときに奇妙なことを行います。たとえば、メインコンテンツの表示(セクション0)がリロードされたように見えます。ユーザーがセクション0にあるソートボタンをタップすると、その色はオレンジ色に変わります。ボタンは短時間オレンジのままですが、ソートが終了すると元の色に戻ります。ユーザーがボタンをもう一度タップするまでは、オレンジ色のままです。セクション0には、この関数が呼び出されたときに再ダウンロードされるように見える画像があります。セクション0のヘッダーの背景は、視覚効果のダークブラービューです。この関数が呼び出されると、もはやぼやけません。少し透明な黒い表示に見えます。さらに、この関数が呼び出されると、すべてのヘッダーが上に移動し、元の位置に戻ります。

これに基づいて、この関数は何とかしてテーブルビューにセクションと行のすべてをリロードすると思います。

質問:へ:)全体のtableViewをリロード:

(1)(でtableView.moveRowを呼び出していますか?もしそうなら、アップデートを特定のセクションに制限する方法はありますか?

(2)文書の表記は、行を挿入または削除しない限り、tableView.beginUpdates()および.endUpdates()を使用する必要があるとは言いません。彼らはここに必要ですか?

(3)tableViewに行を挿入すると、UIVisualEffectViewのレンダリングに関する上記の結果も生成されます。誰にもこの経験がありましたか?

あなたの忍耐とアドバイスをお寄せいただきありがとうございます!

答えて

0

コードは正常に表示されますが、セルが表示領域を超えている場合やセルを再利用する場合を考慮する必要があります。

は、私たちは、セルの再利用時に、それに伴いtableView.scrollToRow(at: , at: UITableViewScrollPosition.top, animated: true)

を使ってスクロールするとき、我々は

tableView.moveRow(at: , to:)

またはも使用して行を移動すると、結果が矛盾していることを確認します。

だから、それはあなたがあなたのデータをソートした後にコメント欄が

reloadSections(_ sections: IndexSet, with animation: UITableViewRowAnimation)

を使用してちょうどことをリロードして良いことです。これにより、そのセクションがリロードされ、再利用されたセルの手間が省けます。

これが役に立ちます。

関連する問題