我正在使用JSQMessagesViewController,它使用JSQMessagesCollectionViewCell加载UICollectionView。
我在collectionView中设置了cellBottomLabel文本:attributedTextForCellBottomLabelAtIndexPath:并且效果很好。
但是,我需要以编程方式刷新此文本。如果我重新加载单元格,一切正常,但出于性能考虑,我不想这样做。
我试图从单元格中访问cellBottomLabel:
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
cell.cellBottomLabel.text = @"TEST";
但这不会刷新文本,除非我向上滚动然后向下滚动(当重新加载单元格时)。
调试器显示包含所需文本的cell.cellBottomLabel,但是如何强制它在单元格显示上刷新?
提前致谢。
答案 0 :(得分:0)
将您的文本存储在以下位置:
@interface SomeViewController ()
@property (nonatomic) NSArray<NSString *> *bottomTexts;
@end
当您获得新的底部文本时:首先,检查您是否在主线程,更新阵列,然后再检查单元格。
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableArray<NSString *> *newBottomTexts = [self.bottomTexts mutableCopy];
newBottomTexts[someIndex] = newText;
self.bottomTexts = newBottomTexts;
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
cell.cellBottomLabel.text = newText;
});
但是如果单元格在更新之前没有底部文本,则不会看到下一个文本,因为label的frame.size.height将为0.在这种情况下,您应该重新加载此单个单元格或至少调整其大小。
答案 1 :(得分:0)
尝试拨打setNeedsDisplay()
。它将强制重新绘制UI元素以更新文本。