2017-08-04 62 views
0

我有一個集合視圖,列出了一堆視頻,並點擊其中的任何視頻都會推動包含自定義播放器視圖的導航控制器來播放視頻。點擊客戶播放器視圖上的關閉按鈕將彈出當前控制器並返回到視頻列表控制器。UICollectionView DidDeselectItemAtIndexPath方法在Swift中沒有調用

此外當點擊其中一個單元格時,該單元格將變成灰色。當從視頻列表中返回並點擊另一個單元格時,我想取消選擇之前選擇的單元格,並將其重新設置爲白色,並使新選中的單元格爲灰色。

問題是,didDeselectCellAtIndexPath方法從來沒有被調用過。之前選擇的單元格會取消選擇,我可以從所選indexPath的打印中看到它。然而,委託方法永遠不會被調用,因此backgroundColor永遠不會變回白色。它看起來像多個單元格被選中,儘管allowedMultipleSesection已被設置爲false。

以下配置設置:

let layout = UICollectionViewFlowLayout() 
collectionView?.collectionViewLayout = layout 
collectionView?.delegate = self 
collectionView?.dataSource = self 
collectionView?.allowsSelection = true 
collectionView?.allowsMultipleSelection = false 

這是我的CollectionView方法和委託方法:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! PreviewCell 
    cell.snapShotImageView.image = videoInfoArray[indexPath.item].previewImg 
    cell.durationLabel.text = videoInfoArray[indexPath.item].lengthText() 
    cell.dateLabel.text = videoInfoArray[indexPath.item].dateAddedText() 
    return cell 
} 


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let cell = collectionView.cellForItem(at: indexPath) as! PreviewCell 
    cell.backgroundColor = UIColor.rgb(red: 240, green: 240, blue: 240) 
    let url = URL(fileURLWithPath: videoInfoArray[indexPath.item].path) 
    let vc = VideoController() 
    self.videoController = vc 
    vc.url = url 
    self.navigationController?.pushViewController(vc, animated: true) 

} 

override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { 
    let cell = collectionView.cellForItem(at: indexPath) as! PreviewCell 

    cell.backgroundColor = UIColor.white 
    cell.captionFileLabel.backgroundColor = .white 
    print("Deselect called!!! This line should be printed, but it never happens!!!!") 
} 

This is the video player view controller

After the controller was popped, the list controller shows two cells selected, but only one of them is selected. The DeselectionItemAtIndexPath not called, even though there is ONLY ONE currently selected cell.

+0

爲什麼你的委託方法有關鍵字'override'?我的意思是,你是什麼類子類?如果父類沒有實現委託方法,則任何子類都不能執行。 – zero

+0

@zero UICollectionViewController,UICollectionViewDelegateFlowLayout,UIImagePickerControllerDelegate,UINavigationControllerDelegate,我是繼承或採用這些類或協議。當我刪除「覆蓋」時,它彈出錯誤提示我添加「覆蓋」。 –

+0

在你的'collectionView'配置下面試試這個:'clearsSelectionOnViewWillAppear = false' – zero

回答

0

如果父類沒有實現委託方法,任何子類將無法要麼做到這一點。

請確保您是子類的類實現它。

0

從文檔我能理解,這方法得到當用戶選擇單元格X時調用,然後選擇單元格Y.現在取消選中單元格X並調用該方法。

在移動到新視圖控制器之前保存所選單元格的索引,並且當您返回到集合視圖控制器時,以編程方式取消選中該單元格,然後在您自己的函數中運行您想要在取消選擇中運行的內容委託方法。

集合視圖在用戶嘗試取消選擇集合視圖中的項目時調用此方法。當您以編程方式取消選擇項目時,它不會調用此方法。 如果您未實現此方法,則默認返回值爲true。

-1

在您的通話didSelectItemAtIndexPath

for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) { [self.collectionView deselectItemAtIndexPath:indexPath animated:NO]; }

0

didDeselectItemAtallowsMultipleSelection設置爲true被調用。

的backgroundColor從未變回白色

即使您以前選定單元格並得到取消,因爲你的觀點犯規得到更新。每次返回時,您都需要更新您的集合視圖單元格視圖。您可以在collectionViewController子類的viewWillAppear中刷新完整的UICollectionView。您還可以使用@entire方法取消選擇所有選定的indexPath。

0

didSelectItemAt方法結束時,在集合視圖上調用deselectItem(at:animated:)方法。

0

讓單元格處理它的背景顏色。 就以下內容添加到您的「PreviewCell」類:

override var isSelected: Bool { 
    didSet { 
     // TODO: replace .red & .blue with desired colors 
     backgroundColor = isSelected ? .red : .blue 
    } 
} 
相關問題