我在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:'?遇到類似的問題並尋找修復程序。 –