2016-02-21 9 views
1

Я пытаюсь отобразить индикатор прогресса внутри ячейки collectionView. Для этого есть фоновый поток, который отправляет уведомление в главный поток для обновления индикатора прогресса.setNeedsDisplay() не обновляет drawViewViewViewCell subView

В главном контроллере представления ...

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, я столкнулся с одной и той же проблемой, но у меня есть правильная ячейка, даже когда dequed beacause я вытаскиваю ее из списка видимых ячеек и сопоставляю с уникальным идентификатором (переменной в классе ячеек), также сопоставляя адреса, но все еще не работает. Можете ли вы PLZ взглянуть на это: https://stackoverflow.com/questions/48201925/custom-uicollectionview-cells-not-updating-when-switched-between-tabs – Rana

0

Как предложил Роб, проблема 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 
}