我在tableview
中显示不同类型的内容,并使用不同的自定义方法在heightForRowAtIndexPath
中计算每个单元格的高度。NSMutableAttributedString initWithData:导致旋转的EXC_BAD_ACCESS
其中一个自定义方法意味着将在NSMutableAttributedString
一些HTML,然后计算该NSMutableAttributedString
的高度。
对于html转换,我使用新的initWithData:
方法。
除了当我旋转屏幕时,所有的工作都很完美=>我每次都有一个exc_bad_access。
使用仪器/僵尸,我一直能找到错误,实际上它是这样的initWithData:
。 (当我删除此方法并创建一个“简单”NSMutableAttributedString
与initWithString
,我可以更改方向多少时间,我想要的,没有crash
了)。
任何想法为什么?
(顺便说一句,我的项目中使用ARC)
仪器/僵尸截图:
称为heightForRowAtIndexPath
定制方法:
< UtilitiesForFrontEndUI heightForFacebookAttributedText
:>
+(CGFloat)heightForFacebookAttributedText:(NSString *)attributedText withWidth:(CGFloat)width
{
NSAttributedString *formatedText = [self formatRawFacebookContentForFrontEndRichTextContents:attributedText];
CGRect rect= [formatedText boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
return ceilf(rect.size.height);
}
使用initWithData为HTML以NSMutableAttributedString
转换定制方法:
< UtilitiesForFrontEndUI formatRawFacebookContentForFrontEndRichTextContents:
>
+(NSAttributedString *)formatRawFacebookContentForFrontEndRichTextContents:(NSString *)stringToFormat
{
// THIS GENERATE EXC_BAD_ACCESS ON DEVICE ROTATION (WORKS IF NO ROTATION)
NSData *dataContent = [stringToFormat dataUsingEncoding:NSUTF8StringEncoding];
NSMutableAttributedString *richTxtContent = [[NSMutableAttributedString alloc] initWithData:dataContent options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
NSRange myRange;
myRange.location = 0;
myRange.length = richTxtContent.length;
[richTxtContent addAttributes:[self commonAttributesForFrontEndRichText] range:myRange];
return richTxtContent;
}
如果我更换initWithData通过简单initWithString没有更多EXC_BAD_ACCESS
+(NSAttributedString *)formatRawFacebookContentForFrontEndRichTextContents:(NSString *)stringToFormat
{
// THIS WORKS (NO MORE ROTATION CRASH)
NSMutableAttributedString *richTxtContent = [[NSMutableAttributedString alloc]initWithString:stringToFormat];
NSRange myRange;
myRange.location = 0;
myRange.length = richTxtContent.length;
[richTxtContent addAttributes:[self commonAttributesForFrontEndRichText] range:myRange];
return richTxtContent;
}
谢谢,你可能是正确的(所以我接受的答案)。我使用了TTTAttributedLabel方式,因为我也希望在这些attributesString中有可点击的“链接”。它的工作完美(在经历了一段艰难的时期,学习如何正确使用它)=非常快速+灵活且易于集成/管理+委托方法 – macbeb
我想补充一点,苹果明确表示不要在后台线程上使用UIKit版本。我通过使用performSelectorOnMainThread解决了这个问题:object:waitUntilDone:它的作用就像一个魅力。 –
@Jesse Naugher我意识到这有点旧,但是你如何结合你所评论的这个答案使用'performSelectorOnMainThread:object:waitUntilDone:'?遇到类似的问题并寻找修复程序。 –