为什么dequeueReusableCell(withReuseIdentifier:for :)在cellForItemAtIndexPath函数范围之外是否为零?

时间:2018-02-20 11:53:12

标签: ios swift uicollectionview uicollectionviewcell nsfetchedresultscontroller

您好我试图在NSFetchedResultsController的委托函数中修改UICollectionView的单元格

controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?)

通过dequeueReusableCell(withReuseIdentifier:for :)函数。但它总是返回零。所以我不得不使用cellForItemAtIndexPath函数。但是为什么dequeueReusableCell返回nil。当然我之前已经注册了课程。

 collectionView?.register(MessageCell.self, forCellWithReuseIdentifier: cellId)

这是代码:

   if type == .update {
        print("UPDATE")
        blockOperations.append(BlockOperation(block: {              
           let cell = self.collectionView?.cellForItem(at: indexPath!)
             as! MessageCell          
 //   let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: self.cellId, for: indexPath!)  returns nil. why?
            let friend = self.fetchedResultsController.object(at: indexPath!) as! Friend               
            cell.message = friend.lastMessage

        }))
    }

2 个答案:

答案 0 :(得分:1)

首先,您实际需要cellForItem,其次,如果目前可见,则会返回一个单元格

   collec.cellForItem(at: NSIndexPath.init(row: 0, section: 0  ) as IndexPath)

答案 1 :(得分:0)

您不得在cellForRowAtIndexPath之外修改UICollectionView的单元格,在NSFetchedResultsController的委托功能中编辑您的基础data model并致电reloadDatareloadRowsAtIndexPaths。< / p>

dequeueReusableCellWithIdentifier必须仅在cellForRowAtIndexPath内使用。