2016-02-21 104 views
1

我想在collectionView單元格內顯示一個進度指示器。爲此,有一個後臺線程向主線程發送通知以更新進度指示器。setNeedsDisplay()不更新collectionViewCell subView的drawRect

在主視圖控制器...

func updateProgressIndicator(notification:NSNotification){ 
     let userInfo = notification.userInfo! as NSDictionary 
     let date = userInfo["date"] as! NSDate 
     let percentComplete = userInfo["percent"] as! Double 

     self.progressIndicator.text = "\(percentComplete)%" // this works 
     let dateIndex = self.calendarDates.indexOf(date) 
     let indexPath = NSIndexPath(forItem: dateIndex!, inSection: 0) 
     let cell = self.collectionView.dequeueReusableCellWithReuseIdentifier("DateCell", forIndexPath: indexPath) as! DateCell 
     cell.showProgress() 
    } 

的函數定位indexPath針對小區進行更新。然後調用單元的showProgress方法。

class DateCell: UICollectionViewCell { 
    @IBOutlet weak var dotGraph: DotGraphView! 

    func showProgress(){ 
     print(" DateCell showProgress") // this does get printed 
     self.setNeedsDisplay() 
    } 

    override func drawRect(rect: CGRect) { 
     print(" DateCell drawRect") // this never gets printed 
     //drawing functions go here 
    } 
} 

對正確的單元格調用showProgress()方法,並顯示打印消息。然而,showProgress方法調用setNeedsDisplay()時,drawRect函數從不執行。

我得到單元更新的唯一方法是使用reloadRowsAtIndexPaths完全重新加載單元,但是這應該是不必要的。

關於如何獲得調用drawRect函數的任何想法?

回答

0

你說showProgress()被稱爲正確的單元格,但這似乎不太可能。當你打電話給dequeueReusableCellWithReuseIdentifier(_:forIndexPath:)時,我希望你得到一個DateCell不同於集合視圖當前顯示的實例。顯示的那個正在使用,所以它不會從dequeue...方法返回。您可以在單元格上使用NSLog來測試我是否正確。我期望這個地址與你在cellForItemAtIndexPath()中返回的地址不同。

您不應該出列單元格,而應將該單元格放入屬性中,以便每個人都使用相同的單元格。這也是你應該在cellForItemAtIndexPath()中返回的單元格。

+0

謝謝...這正是它。我創建了一個字典來保存這些單元格,以便每次在CollectionView中創建一個單元格時,該單元格將被存儲。然後,如所建議的那樣,只需調用所需單元格的'showProgress()'函數即可。 – Dustin

+0

@Rob Napier,我面臨着同樣的問題,但即使是因爲我將它從可見單元格的列表中拉出並與唯一標識符(單元格類中的變量)匹配,我也有正確的單元格,並且也匹配地址,但仍然無法正常工作。 你可以看看這個:https://stackoverflow.com/questions/48201925/custom-uicollectionview-cells-not-updating-when-switched-between-tabs – Rana

0

正如Rob建議的那樣,dequeueReusableCellWithReuseIdentifier(_:forIndexPath:)導致了問題。當單元格在創建時存儲在字典中時,可以直接引用它。這意味着,drawRect()將被稱爲與setNeedsDisplay()

以下是更新的功能...

var calendarDateCells:[NSDate:DateCell] = [:] 

func updateProgressIndicator(notification:NSNotification){ 
    let userInfo = notification.userInfo! as NSDictionary 
    let date = userInfo["date"] as! NSDate 
    let myCell = self.calendarDateCells[date] 
    if(myCell != nil){ 
     myCell!.showProgress() 
    } 
} 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("DateCell", forIndexPath: indexPath) as! DateCell 
    let date = calendarDates[indexPath.item] 
    self.calendarDateCells[date] = cell 
    return cell 
} 
相關問題