2015-11-04 48 views
1

所以我有圖像的colectionView,當東西在後臺會發生,我可能會嘗試使用該方法來選擇特定的自定義collectionViewCell爲什麼在代碼中選擇單元格後,我的自定義集合意外地顯示爲零?

self.collectionView.selectItemAtIndexPath(indexPathToReload, animated: true, scrollPosition: UICollectionViewScrollPosition.CenteredVertically),工作正常,在collectionView滾動到所需的位置。

但是,如果我然後嘗試實際更新單元格的外觀,因爲它已通過調用self.collectionView(self.collectionView, didSelectItemAtIndexPath: indexPathToReload)進行更新,所以當我嘗試在didSelectItemAtIndexPath中創建單元格時,出現意外的零單元格。

我部分明白,爲什麼更新細胞的這種方法是不安全的(因爲我已經在研究類似here in one of the answers這個問題在其他地方閱讀。)

因此,碰撞讓我假設細胞是不可見的部分細胞在屏幕上,這就是爲什麼當我嘗試創建它時單元格爲零。但是這樣做沒有意義,因爲我也假定必須創建單元格才能滾動到正確的位置,正如我所說的那樣,罰款是因爲它們按預期方式創建並且可以毫無問題地進行交互。

那麼爲什麼我的細胞零?或者爲什麼我的集合視圖不認爲滾動到可見單元格的單元格?如果原因很明顯,那麼在代碼中選擇它時如何才能更新它的外觀?

編輯:代碼在上下文中

dispatch_async(dispatch_get_main_queue()) { 
    self.collectionView.selectItemAtIndexPath(indexPathToReload, animated: true, scrollPosition: UICollectionViewScrollPosition.CenteredVertically) 
    self.collectionView(self.collectionView, didSelectItemAtIndexPath: indexPathToReload) 
    return 
} 

正如我已經說過了,這幾乎是上下文。在第一行中,我可以滾動到屏幕上不可見的索引。如果我這樣做,然後執行第二行代碼,則在調用的委託方法中創建的單元格意外爲零。

+0

分享一些你的代碼,所以我們可以看到它在上下文。 –

+0

這幾乎是上下文,但我會更新我的答案。 – pbush25

+0

調用'selectItemAtIndexPath'應該自動觸發'didSelectItemAtIndexPath'上的調用。你爲什麼要調用它像'self.collectionView(self.collectionView,didSelectItemAtIndexPath:indexPathToReload)'? – Abhinav

回答

0

爲了解決這個問題,我不得不使用一種哈克解決方法,雖然工作似乎太髒了,我不知道蘋果爲什麼沒有解決這個問題(即爲什麼selectItemAtIndexPath doesn撥打代表方式didSelectItemAtIndexPath)。不管怎麼說,我落得這樣做,當我需要在後臺更新我選定單元格,我第一次拿到了指數,並設置一個布爾值,顯示單元代碼選擇:

dispatch_async(dispatch_get_main_queue()) { 
    self.collectionView.selectItemAtIndexPath(indexPathToReload, animated: true, scrollPosition: UICollectionViewScrollPosition.CenteredVertically) 
    let cell = self.collectionView.cellForItemAtIndexPath(indexPathToReload) as? ListingCollectionViewCell 
    if cell != nil { 
     self.collectionView(self.collectionView, didSelectItemAtIndexPath: indexPathToReload) 
     return 
    } else { 
     self.buttonSelectedInCode = true 
     self.indexPathSelectedInCode = indexPathToReload 
     return 
    } 
} 

以上,我不得不嘗試爲指定的索引路徑創建單元格。如果單元格不是零,那麼我知道單元格是可見的,並且可以安全地調用委託人didSelectItemAtIndexPath。但是,如果單元格爲零,則必須設置我的布爾和索引,並等待滾動視圖調用委託方法,如下所示。

然後,我進一步落實scrollViewDidEndScrollAnimation,並使用該委託方法的調用,然後選擇我的碼單元,具體如下:

func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { 
    if buttonSelectedInCode { 
     self.collectionView(self.collectionView, didSelectItemAtIndexPath: self.indexPathSelectedInCode) 
    } 
} 
相關問題