2017-04-17 123 views
2

製作後,我一直都有點吃力用於儲蓄,而該細胞被標記和沒有,這個問題並不難不讓被選中。經過幾次嘗試,所有關於保存indePath的地方,回到視圖與收集後,我們能夠做arrayarrayindexPathscollectionView方法willDisplay內的一些東西。基本上,它看起來如何:細胞採集它選擇

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 - 爲什麼?有人能幫助我嗎?

提前致謝!

編輯

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,細胞是的,它會被選中,但..有一個問題,即使是在u盤上這些選擇後,U中的委託一格內按一下就會跳入didSelectItemAt,而不是didDeselectItemAt所以要取消選中你需要的單元格兩次,這是不好的。

,我們可能增加willDisplay cell.isSelected = true但在那之後我們解決了問題的~50% becouse我們不能再取消他們的第二件事情,委託沒有任何反應多爲其他選定的單元格,而不是第一選擇。

我問我自己,如果我的一切後做同樣的東西裝?然後我嘗試了它 - 它的工作原理!

對於我用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) 
      }) 
     } 
    } 
} 

也許不能解決你的問題,但它肯定會更簡單調試。另外,您不需要直接在您的手機上設置isSelectedUICollectionView.selectItem已經做到了。

你也應該檢查你是否得到所有正確的IndexPath s,並在完成加載數據後在你的集合視圖中調用UICollectionView.reloadData

+0

'isSelected'是需要的因爲不知何故,如果你不這樣做,單元格認爲它還沒有被選中,即使我已經改變了視圖等,它需要點擊兩次以取消選擇,所以在第一次它去了選擇,然後第二次取消選擇:D werid行爲 - alrady調試。路徑也是正確的。我制定了一個算法讓他們保持良好狀態。 – yerpy

+0

它不應該被需要。從蘋果公司的文檔:[「你通常不直接設置該屬性的值。以編程方式更改此屬性的值不會更改單元格的外觀。選擇單元格並突出顯示它的首選方法是使用選擇方法的集合視圖對象。「](https://developer.apple.com/reference/uikit/uicollectionviewcell/1620130-isselected) –

+0

我同意你的意見,但不知何故不能像他們說的那樣工作。雖然我把選定的項目,它應該去選擇第一步選擇的項目後,「didSelectItemAt」,但「didDeselectItemAt」 – yerpy