如何在JSQMessagesViewController中以编程方式更改cellBottomLabel?

时间:2016-12-09 20:32:22

标签: ios objective-c uicollectionview jsqmessagesviewcontroller

我正在使用JSQMessagesViewController,它使用JSQMessagesCollectionViewCell加载UICollectionView。

我在collectionView中设置了cellBottomLabel文本:attributedTextForCellBottomLabelAtIndexPath:并且效果很好。

但是,我需要以编程方式刷新此文本。如果我重新加载单元格,一切正常,但出于性能考虑,我不想这样做。

我试图从单元格中访问cellBottomLabel:

JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
cell.cellBottomLabel.text = @"TEST";

但这不会刷新文本,除非我向上滚动然后向下滚动(当重新加载单元格时)。

调试器显示包含所需文本的cell.cellBottomLabel,但是如何强制它在单元格显示上刷新?

提前致谢。

2 个答案:

答案 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元素以更新文本。