2016-11-17 13 views
1

グッドモーニング(スウィフト)展開と折りたたみテーブルビューセルタップ

は、私は内部CollectionViewCellと方向矢印を持つカスタムTableViewCellを、作成しました。セルを展開して折りたたむことができましたが、1つのセルを展開して前の折りたたみをもう一度クリックすると、そのセルを展開したいと思っています。例:セルが展開され、セルがタップされている場合は、セルを縮小し、セルを同時に展開します。ターゲットの矢印を変更すると、その瞬間に1つのセルのみが展開状態になることができます。

例:

内陣が展開され、CELLBがタップされた場合、私は内陣を収縮さとCELLBが同時に展開したいです。そのため、ターゲットの矢印を変更している瞬間に、1つのセルのみが展開状態になることがあります。

マイコード:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 






    switch(selectedIndexPath) 
    { 

    case nil: 

     let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell 
     cell.arrowImagem.image = UIImage(named:"content_arrow2") 
     selectedIndexPath = indexPath 



    default: 
     if selectedIndexPath! == indexPath 
     { 

      let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell 
      cell.arrowImagem.image = UIImage(named:"content_arrow") 
      //cell.reloadInputViews() 
      selectedIndexPath = nil 

     } 


    } 

    self.myTableView.beginUpdates() 

    self.myTableView.reloadData() 


    //myTableView.reloadRows(at: [indexPath], with: .automatic) 

    self.myTableView.endUpdates() 

} 


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 





    let index = indexPath 

    if selectedIndexPath != nil{ 
     if(index == selectedIndexPath) 
     { 
      return 147 
     } 
     else{ 
      return 67 
     } 
    } 
    else 
    { 
     return 67 
    } 



} 
+0

申し訳ありませんが、私はbegginingを翻訳いけません質問の おはよう 私はcreat内部的にCollectionViewCellと方向矢印を持つカスタムTableViewCellを作成しました。 セルを展開して折りたたむことができましたが、1つのセルを展開して、前の折りたたみをもう一度クリックすると欲しいです。 例: セルが展開され、セルがタップされている場合は、セルを縮小し、セルを同時に展開します。ターゲットの矢印を変更すると、その瞬間に1つのセルのみが展開状態になることができます。 –

+2

何かを修正したり追加したりする必要がある場合は、いつでも質問を編集することができます。 – Moritz

+1

info Ericに感謝します:) –

答えて

0

あなたはそれを行うことができますが、あなたには、いくつかのコーディングを行う必要があります。まず、行が選択されたときに検出されます(選択された行のインデックスパスを変数に保持します)。行が選択されると、didSelectRowAtの内部からtableView reloadRowsに渡す配列に、選択した新しい行と以前に選択した変数(変数にあるもの)のインデックスパスを追加します。この関数は、 2行とheightForRowAt関数は両方の行の高さを取得するために呼び出され、heightForRowAtでは現在選択されている行をチェックし(先ほど触れた変数を覚えていますか?)、それに対して拡張された高さを返します。折りたたんだ高さを返します。あなたはあなたが望む結果を得るべきです。助けてくれることを願っています。

+0

ありがとうSergio私はあなたの解決策を試してみます –

+0

あなたを大歓迎です! – Sergiob

+0

あなたのアイデアに感謝Sergio私は私の問題を解決する関数を構築しました:) –

0

あなたはdidSetハンドラでほとんどの機能を実装することができますで、その後

var selectedIndexPath: IndexPath? { 
    didSet { 
     guard indexPath != oldValue else { 
      return 
     } 

     if let oldValue = oldValue { 
      let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell 
      cell?.arrowImagem.image = UIImage(named:"content_arrow") 
     } 

     if let indexPath = indexPath { 
      let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell 
      cell?.arrowImagem.image = UIImage(named:"content_arrow2") 
     } 

     let rowsToUpdate = [indexPath, oldValue].flatMap {$0} 

     self.myTableView.beginUpdates() 

     // I don't think you actually need to reload rows here but keeping your code here... 
     self.myTableView.reloadRows(at: rowsToUpdate, with: .automatic) 
     self.myTableView.endUpdates() 
    } 
} 

とあなたのdidSelect

if indexPath == selectedIndexPath { 
    selectedIndexPath = nil 
} else { 
    selectedIndexPath = indexPath 
} 

(テストなしで書かれた)

関連する問題