2017-04-17 21 views
2

私はどのセルがマークされていたのか保存されていないのかを悩ましています。いくつか試行した後、それはすべてindePathを保存することに関するものであり、コレクションのビューに戻ると、indexPathscollectionViewの方法のarrayの中のいくつかのものを行うことができます。基本的にそれはどのように見える:コレクションのセルが選択された後にチェックが外されないようにしました

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
     switch collectionView { 
     case myCollection: 
      var count: Int = 0 
      if !SessionMenager.Instance.indexPaths.isEmpty { 
       for index in SessionMenager.Instance.indexPaths { 
        if index == indexPath { 
         print(SessionMenager.Instance.indexPaths.count) 
         myCollection.selectItem(at: SessionMenager.Instance.indexPaths[count], animated: true, scrollPosition: .bottom) 
         var image = cell.viewWithTag(1) as! UIImageView 
         UIView.animate(withDuration: 0.25, animations: { 
          image.transform = CGAffineTransform(scaleX: 1.3, y: 1.3) 
          image = image.drawRingForCircle(imageView: image, color: .white) 
         }) 
         cell.isSelected = true 
         count += 1 
        } 
       } 
      } 
     default: 
      break 
     } 
    } 

これは完璧に動作しますが、片方だけです。今は別のviewに行く前に最初に選択したセルを除いて、選択したセルの選択を解除できません - それはなぜですか?誰も私を助けることができる?

ありがとうございます!

EDIT

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath { 

switch collectionView { 

case xxx: 
     break 
case yyy: 
     break 
     case myCollection: 
      let image = myCollection.cellForItem(at: indexPath)?.viewWithTag(1) as! UIImageView 

      UIView.animate(withDuration: 0.25, animations: { 
       image.transform = CGAffineTransform(scaleX: 1, y: 1) 
       image.layer.sublayers?.removeLast() 
      }) 

      for (key, _) in tmpDict { 
       if key == image { 
        if let index = self.choosenData.index(of: tmpDict[key]!) { 
         self.choosenData.remove(at: index) 
         SessionMenager.Instance.indexPaths = SessionMenager.Instance.indexPaths.filter { $0 != indexPath } 
        } 
       } 
      } 
     default: 
      break 
     } 
} 
+0

どのように細胞の選択を解除しようとしていますか?あなたは選択部分を行うコードだけを掲載しました。 –

+0

@PedroCastilho他のセルに対して 'didDeselectItemAt'メソッドを入力せず、最初のものを保存します。しかし、あなたは雇われています! – yerpy

+0

なぜ 'switch'ステートメントですか? –

答えて

0

ANSWER

私はそれが動作するために行われなければならないものをfugure! 基本的に誰かが同様の問題を抱えている場合は、私はwillDisplay cellメソッドをお勧めしません - その場合はうまくいきません。 このメソッド内のコレクションで.selectItemを呼び出している間に、セルが選択されますが、セル内でクリックした後にデリゲートを選択しても、didDeselectItemAtの代わりにdidSelectItemAtにジャンプしますセルをチェックしないようにするには、2回クリックする必要があります。我々はwillDisplay cell.isSelected = trueに追加するかもしれないが、我々はこれ以上彼らの選択を解除することはできませんbecouseその後、我々は我々の問題の~50%を解決

2つ目は、デリゲートは、選択された他の選択したセルの代わりに、最初のためにこれ以上反応しません。

私は自分に尋ねます。すべてがロードされた後も同じことをすればどうなりますか?それから私はそれをtryidしました - それは動作します!

私はviewDidAppear(_ animated: Bool)を使用しました。

if !SessionMenager.Instance.indexPaths.isEmpty { 
      for index in SessionMenager.Instance.colorsIndexPaths { 
       let cell = myCollection.cellForItem(at: index)! 
       myCollection.selectItem(at: index, animated: true, scrollPosition: .bottom) 
       var something = cell.viewWithTag(**YOUR TAG**) as! SMTH 

       // And the body what would you like to do with `something`, ex. increase scale of item, change a background, tint color etc. 

       }) 
      } 
     } 

が、それは願っていますそれを必要とする人を支援します。

実施例は次のようになります!乾杯!

0

これはどのようにあなたのcollectionView(_:willDisplay:forItemAt:)方法の変更について:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
    var count: Int = 0 
    for index in SessionMenager.Instance.indexPaths { 
     if index == indexPath { 
      myCollection.selectItem(at: indexPath, animated: true, scrollPosition: .bottom) 
      var image = cell.viewWithTag(1) as! UIImageView 
      UIView.animate(withDuration: 0.25, animations: { 
       image.transform = CGAffineTransform(scaleX: 1.3, y: 1.3) 
       image = image.drawRingForCircle(imageView: image, color: .white) 
      }) 
     } 
    } 
} 

それはあなたの問題を解決しないかもしれませんが、それは間違いなくデバッグが単純になります。また、セルに直接isSelectedを設定する必要はありません。 UICollectionView.selectItemは既にそれを行います。

また、データの読み込みが完了したら、コレクションビューでIndexPathがすべて正しいかどうかを確認して、UICollectionView.reloadDataを呼び出してください。

+0

'isSelected'は必要なのですが、何もしないと、セルが選択されていないと思っても、ビューを変更しても、それを2回クリックして選択解除する必要があります。選択してから2度目の選択を解除します。パスも正しい。私はそれらをうまく保つためにalgorythmを作った。 – yerpy

+0

それは必要ではありません。 Appleのドキュメントから:[通常、このプロパティの値を直接設定しないでください。このプロパティの値をプログラムで変更してもセルの外観は変更されません。セルを選択して強調表示する方法としては、 "](https://developer.apple.com/reference/uikit/uicollectionviewcell/1620130-isselected) –

+0

私はあなたに同意しますが、何とか彼らが言うように動作しません。私が選択したアイテムを置いている間、それは最初のステップのための選択されたアイテムの選択の後に 'didSelectItemAt'に行くのですが、' didDeselectItemAt' – yerpy

関連する問題