2016-09-23 51 views
0

我有UITableViewController。內側部分1有一個細胞顯示JTAppleCalendar與容易填充:Swift/TableView可重用單元格每次顯示不同內容時加載

if indexPath.section == 1 { 

     let cell = tableView.dequeueReusableCellWithIdentifier("calendarViewCell") as! CalendarViewCell 

     print(eventDatesAsNSDates) 
     cell.calendarView.selectDates(eventDatesAsNSDates)    
     return cell 
    } 

eventDatesAsNSDates被內viewDidAppear填充。

從理論上說,一切都按照我的意願工作。但是,如果我向下滾動TableView,會發生完全令人討厭的行爲。

enter image description here

的cellForRowAtIndexPath print(eventDatesAsNSDates)內print語句證明eventDatesAsNSDates不會改變,但日曆可被填充一次,而不是其他的時間,然後再次填充......

無論cell.calendarView.selectDates也不eventDatesAsNSDates在App中被設置或調用另一次。

我錯過了什麼?非常感謝幫助。

按照要求,selectDates功能:

public func selectDates(dates: [NSDate], triggerSelectionDelegate: Bool = true, keepSelectionIfMultiSelectionAllowed: Bool = false) { 
     var allIndexPathsToReload: [NSIndexPath] = [] 
     var validDatesToSelect = dates 
     // If user is trying to select multiple dates with multiselection disabled, then only select the last object 
     if !calendarView.allowsMultipleSelection && dates.count > 0 { validDatesToSelect = [dates.last!] } 

     let addToIndexSetToReload = {(indexPath: NSIndexPath)->Void in 
      if !allIndexPathsToReload.contains(indexPath) { allIndexPathsToReload.append(indexPath) } // To avoid adding the same indexPath twice. 
     } 

     let selectTheDate = {(indexPath: NSIndexPath, date: NSDate) -> Void in 
      self.calendarView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: .None) 
      addToIndexSetToReload(indexPath) 
      // If triggereing is enabled, then let their delegate handle the reloading of view, else we will reload the data 
      if triggerSelectionDelegate { 
       self.internalCollectionView(self.calendarView, didSelectItemAtIndexPath: indexPath) 
      } else { // Although we do not want the delegate triggered, we still want counterpart cells to be selected 

       // Because there is no triggering of the delegate, the cell will not be added to selection and it will not be reloaded. We need to do this here 
       self.addCellToSelectedSetIfUnselected(indexPath, date: date) 
       let cellState = self.cellStateFromIndexPath(indexPath, withDate: date) 
       if let aSelectedCounterPartIndexPath = self.selectCounterPartCellIndexPathIfExists(indexPath, date: date, dateOwner: cellState.dateBelongsTo) { 
        // If there was a counterpart cell then it will also need to be reloaded 
        addToIndexSetToReload(aSelectedCounterPartIndexPath) 
       } 
      } 
     } 

     let deSelectTheDate = { (oldIndexPath: NSIndexPath) -> Void in 
      addToIndexSetToReload(oldIndexPath) 
      if let index = self.theSelectedIndexPaths.indexOf(oldIndexPath) { 
       let oldDate = self.theSelectedDates[index] 
       self.calendarView.deselectItemAtIndexPath(oldIndexPath, animated: false) 
       self.theSelectedIndexPaths.removeAtIndex(index) 
       self.theSelectedDates.removeAtIndex(index) 

       // If delegate triggering is enabled, let the delegate function handle the cell 
       if triggerSelectionDelegate { 
        self.internalCollectionView(self.calendarView, didDeselectItemAtIndexPath: oldIndexPath) 
       } else { // Although we do not want the delegate triggered, we still want counterpart cells to be deselected 
        let cellState = self.cellStateFromIndexPath(oldIndexPath, withDate: oldDate) 
        if let anUnselectedCounterPartIndexPath = self.deselectCounterPartCellIndexPath(oldIndexPath, date: oldDate, dateOwner: cellState.dateBelongsTo) { 
         // If there was a counterpart cell then it will also need to be reloaded 
         addToIndexSetToReload(anUnselectedCounterPartIndexPath) 
        } 
       } 
      } 
     } 

     for date in validDatesToSelect { 
      let components = self.calendar.components([.Year, .Month, .Day], fromDate: date) 
      let firstDayOfDate = self.calendar.dateFromComponents(components)! 

      // If the date is not within valid boundaries, then exit 
      if !(firstDayOfDate >= self.startOfMonthCache && firstDayOfDate <= self.endOfMonthCache) { continue } 
      let pathFromDates = self.pathsFromDates([date]) 

      // If the date path youre searching for, doesnt exist, then return 
      if pathFromDates.count < 0 { continue } 
      let sectionIndexPath = pathFromDates[0] 

      // Remove old selections 
      if self.calendarView.allowsMultipleSelection == false { // If single selection is ON 
       let selectedIndexPaths = self.theSelectedIndexPaths // made a copy because the array is about to be mutated 
       for indexPath in selectedIndexPaths { 
        if indexPath != sectionIndexPath { deSelectTheDate(indexPath) } 
       } 

       // Add new selections 
       // Must be added here. If added in delegate didSelectItemAtIndexPath 
       selectTheDate(sectionIndexPath, date) 
      } else { // If multiple selection is on. Multiple selection behaves differently to singleselection. It behaves like a toggle. unless keepSelectionIfMultiSelectionAllowed is true. 
       // If user wants to force selection if multiselection is enabled, then removed the selected dates from generated dates 
       if keepSelectionIfMultiSelectionAllowed { 
        if selectedDates.contains(calendar.startOfDayForDate(date)) { 
         addToIndexSetToReload(sectionIndexPath) 
         continue // Do not deselect or select the cell. Just add it to be reloaded 
        } 
       } 
       if self.theSelectedIndexPaths.contains(sectionIndexPath) { // If this cell is already selected, then deselect it 
        deSelectTheDate(sectionIndexPath) 
       } else { 
        // Add new selections 
        // Must be added here. If added in delegate didSelectItemAtIndexPath 
        selectTheDate(sectionIndexPath, date) 
       } 
      } 
     } 


     // If triggering was false, although the selectDelegates weren't called, we do want the cell refreshed. Reload to call itemAtIndexPath 
     if /*triggerSelectionDelegate == false &&*/ allIndexPathsToReload.count > 0 { 
      delayRunOnMainThread(0.0) { 
       self.batchReloadIndexPaths(allIndexPathsToReload) 
      } 
     } 
    } 
+0

你可以發佈你selectDates方法嗎? – pedrouan

+0

這是一個由JTAppleCalendar提供的非常複雜的方法,但肯定 –

+0

我不希望每次單元再次可見時更新單元。有沒有可能避免這種情況? –

回答

1

cellForRow委託方法嘗試更新的tableView行/節(S)每個細胞是再次顯示時間。

我肯定會準備數據(日曆)的其他地方,我寧願只呈現數據。 UITableViewCell的可重用性將正確處理內容。

不要在cellForRow方法中調用該方法。嘗試將其放置進入viewDidAppear()方法。如果selectDates()方法執行更新tableView的所有工作,它仍然可以工作。

相關問題