2013-01-23 108 views
24

我有一個CollectionView中的多個項目,但只有少數應該可以選擇。我與委託方法處理這個:UICollectionView shouldSelectItemAtIndexPath = NO不會避免取消選擇舊選擇?

- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath 

如果選擇的被選擇項目,並在接下來的步驟中不被選擇項目的選擇是通過shouldSelectItemAtIndexPath拒絕返回NO,所選擇的項目被取消時我的問題無論如何。

我也曾嘗試使用

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath 

但它是同樣的問題。

這是UICollectionView的正確行爲嗎?如果是的話,我如何避免取消選擇我最後選擇的項目,如果一個不可選擇的項目被選中?

回答

11

我得糾正我的假設:最後的選擇不會被取消選擇!

爲了改變選擇單元格的外觀,我已經重寫了UICollectionViewCell的setSelected訪問器。 選擇不可選項目時,最後選定單元格的訪問者setSelected被多次調用。首先是狀態NO,然後是狀態YES,最後是NO。最後一個狀態NO導致我的細胞將其外觀設置爲未選擇的細胞。

我不知道這種奇怪的行爲的原因,我也不能解決它。

我的解決方法是直接在ViewController中更改所選單元格的外觀。

設置在選定的外觀:如果選擇在當前小區

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath 

檢查和改變外觀像預期一樣:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

刪除選中的外觀。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
0

你試過:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath 

我發現,這個當過期望。

+0

此方法僅適用於多種選擇各項指標 –

1

您應該在委託方法DidSelect和DidDeselect方法中更改單元格外觀。如果在shouldSelect方法中返回NO,則不會調用DidSelect和DidDeselect,因此外觀將保持不變,與collectionView的選定狀態保持一致。

0

我不知道爲什麼UICollectionView是如此混亂,與UITableViewController相比... 我發現了一些事情。

多次調用- setSelected:的原因是因爲序列方法被調用。該序列與UITextFieldDelegate方法非常相似。

collectionView實際選擇單元之前調用方法- collectionView:shouldSelectItemAtIndexPath:,因爲它實際上是在詢問「它應該被選中」嗎?

- collectionView:didSelectItemAtIndexPath:實際上是在collectionView選擇了該單元之後調用的。因此,名稱「確實選擇了」。

同樣適用於取消選擇。

TL; DR - 讓您的collectionView通過調用- selectItemAtIndexPath:animated:scrollPosition:取消選擇委託方法- collectionView:shouldSelectItemAtIndexPath:中的單元格,並且一切正常。

0

我剛剛有同樣的問題。我嘗試了各種解決方案,第一個解決方案是重新加載然後重新選擇所選單元。無論我重新加載整個集合視圖,還是僅使用非選定外觀的單元格,這對我都有效。

接近於沒有爲我工作:

  • 細胞的selected屬性設置爲true,甚至翻轉它的虛假然後再正確的。
  • 通過-selectItemAtIndexPath:animated:scrollPosition:選擇項目,或者通過-deselectItemAtIndexPath:取消選擇,然後再次選擇。
  • 重新加載只與選定的行-reloadItemsAtIndexPaths:
  • 重新加載一切與-reloadData
0

我通過設置self.collectionView.allowsMultipleSelection = true解決了這個問題。

,並取消當我回到真正-collectionView:shouldSelectItemAtIndexPath: