tableview
にさまざまなタイプのコンテンツを表示し、異なるカスタムメソッドを使用して各セルの高さを計算します(heightForRowAtIndexPath
)。NSMutableAttributedString initWithData:回転時にEXC_BAD_ACCESSを発生させる
これらのカスタムメソッドの1つは、NSMutableAttributedString
で一部のhtmlを変換し、次にこの高さを計算することを意味します。NSMutableAttributedString
html変換では、新しいinitWithData:
メソッドを使用します。
私は画面を回転させる以外はすべて完璧に動作します=>私は毎回exc_bad_accessを持っています。
Instruments/Zombiesを使用して、私はエラーを見つけることができました。実際はinitWithData:
です。
(この方法を削除してinitWithString
で「シンプル」NSMutableAttributedString
を作成すると、何度でも向きを変更できます。いいえ、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);
}
NSMutableAttributedString
変換するHTMLのためinitWithDataを使用したカスタム方法:
< 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;
}
私はこれ以上のEXC_BAD_ACCESS簡単なinitWithStringでinitWithDataを交換する場合
+(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;
}
おかげで、あなたは(私は答えを受け入れた)、おそらく正しいです。私は、これらのattributedStringの中にクリック可能な "リンク"を持っていたかったので、TTTAttributedLabelの方法で行った。非常に速く、柔軟性があり、+デリゲートメソッドを統合/管理するのが難しいです。 – macbeb
私はAppleがバックグラウンドスレッドでUIKitバージョンを使わないと明言しています。 performSelectorOnMainThread:object:waitUntilDone:を使用してこれを修正しました。これは魅力的です。 –
@Jesse Naugher私はこれはやや古いことを認識していますが、あなたがコメントしたこの答えと一緒に 'performSelectorOnMainThread:object:waitUntilDone:'をどう使ったのですか?同様の問題にぶつかり、修正を探しています。 –