在出列的单元格UITextView上更新attributionText会使应用程序冻结

时间:2017-02-13 10:38:25

标签: ios uitableview uitextview nstextattachment nstextcontainer

我目前被困在一堵大墙上......

我使用包含UITableViewCell个自定义UITextView图片的自定义NSTextAttachment

每个NSTextAttachment都会覆盖

 - (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex;

- (UIImage *)imageForBounds:(CGRect)imageBounds
              textContainer:(NSTextContainer *)textContainer
             characterIndex:(NSUInteger)charIndex;

来自NSTextAttachmentContainer协议。

此处的目标是显示不同大小的图像,并使边界适应可用空间。

我还需要在缓存之前使用专用单元格上的sizeThatFits语句计算单元格高度。

直到今天,当我试图列出一系列特定内容时,一切正常。

当旧单元格出列以显示全新单元格时,我的应用程序只会冻结[_textView setAttributedString:myAttributedText];语句(堆栈中的[NSATSTypesetter beginLineWithGlyphAtIndex:])。

我只是尝试了一切,以避免每次重建细胞(实际上都有效)。

这是我发现的:

  • 即使我"硬编码"问题仍然​​存在。返回单元格高度值。
  • 更改NSTextAttachment边界(并保持单元格高度)似乎使错误消失而没有任何逻辑......
  • 它显然是内容的魔鬼组合,因为如果我改变单元格高度以使得后来发生出列,一切正常。实际上,所涉及的两个单元格都包含仅包含一个图像的文本。
  • 我查看了- (void)prepareForReuse方法并尝试重置UITextView状态,也是徒劳。
  • 每次单元格出列时重新创建一个全新的UITextView似乎可以解决问题。

有什么想法吗?我是否需要了解有关出列系统或NSTextAttachmentContainer协议的重要信息?

非常感谢提前。

修改 我发现解决这个问题的唯一方法就是:

- (void)prepareForReuse
{
    [super prepareForReuse];

    // Reset text
    _contentTextView.attributedText = nil;
    [_contentTextView sizeToFit];
}

sizeToFit声明非常重要!

0 个答案:

没有答案