2017-06-01 50 views
4

我有一個應用程序,它包含一個時間表(UITableView)和一個白天(UICollectionView)。用戶可以通過以下兩種方法之一改變自己選定日期:如何更改尚未顯示在屏幕上的單元格的屬性?

  1. 從DayBar
  2. 選擇一天點擊「JumpToTomorrow」按鈕,表格視圖的底部。

現在的問題是,當我在第二天尚未滾動到屏幕上的場景中單擊它時,未選擇當天的單元格(請參閱下文)。 enter image description here

DayCollectionViewCell.isSelected(不會被調用由於某種原因)

override var isSelected: Bool { 
    didSet { 
     self.backgroundColor  = self.getBackgroundColor(selected: isSelected) 
     self.layer.borderColor  = self.getBorderColor(selected: isSelected) 
     self.number.attributedText = NSAttributedString(string: number.text!, attributes: self.getTextAttributes(selected: isSelected)) 
    } 
} 

DayBarController功能

override func viewDidLoad() { 
    super.viewDidLoad() 
    // To preserve selection between presentations 
    self.clearsSelectionOnViewWillAppear = false 
    setEdgeInsets() 
    BroadcastManager.listen(to: PrepNotifications.JumpToTomorrowClicked, listenerId: "UpdateSelectedDay", react: updateSelectedDay) 
} 
    /// change the selected day and notify the app about the change 
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    PrepGlobals.Calendar.SELECTED_DAY = indexPath.row 
    BroadcastManager.broadcast(PrepNotifications.SelectedDayChanged) 
    //scroll to center on selected day in case of clicked on today 
    if (PrepGlobals.Calendar.TODAY_INDEX == indexPath.row){ 
     self.collectionView?.scrollToItem(
      at: indexPath, 
      at: .centeredHorizontally, 
      animated: true 
     ) 
    } 
} 

private func updateSelectedDay(_ userInfo: [AnyHashable: Any]? = nil) { 
    PrepGlobals.Calendar.SELECTED_DAY += 1 
    let selectedDayIndex = IndexPath(row: PrepGlobals.Calendar.SELECTED_DAY, section: 0) 
    self.collectionView!.selectItem(at: selectedDayIndex, animated: true, scrollPosition: .right) 
    BroadcastManager.broadcast(PrepNotifications.SelectedDayChanged) 
} 

回答

1

我編輯了我的答案。其實你必須手動設置isSelected。

override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
     cell.isSelected = (indexPath.row == PrepGlobals.Calendar.SELECTED_DAY) 
} 
+0

這也適用。 – Deco

1

你應該修改collectionView(_:cellForItemAt:)檢查細胞指數應選擇或不,並更新那裏的風格。

+0

這似乎並沒有被要求我所需要的細胞。在我的問題''collectionView(_cellForItemAt)'圖片中的圖片被調用的單元格5和7.當我們正在尋找將選擇從5更改爲6. – Deco

+0

看起來像預取導致它被稱爲之前,它出現在屏幕或被設置爲「選擇」。 – Deco

1

禁用預取修復此問題。

enter image description here

相關問題