2017-04-01 3 views
0

Meine UITextView reagiert auf UIContentSizeCategoryDidChangeNotification auf dynamische Schrift Veränderungen zu reagieren, und ich implementiert den folgenden Code:Absturz beim Aktualisieren NSTextStorage Schrift

NSTextStorage * textStorage = [self textStorage]; 
[textStorage beginEditing]; 
[textStorage enumerateAttribute: NSFontAttributeName 
         inRange: NSMakeRange(0, [textStorage length]) 
         options: 0 
        usingBlock: ^(id value, NSRange range, BOOL * stop) { 
         UIFont *newFont = [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f]; 

         if (newFont) { 
          [textStorage removeAttribute: NSFontAttributeName 
                range: range]; 
          [textStorage addAttribute: NSFontAttributeName 
               value: newFont 
               range: range]; 
         } 
        }]; 

[textStorage endEditing]; 

Es ist immer in der letzten Zeile abstürzt, [textStorage endEditing];. Ich habe Ausnahmen Haltepunkte, aktiviert, aber es gibt keine zusätzlichen Informationen im Debug-Bereich siehe die Backtrace unten. Wenn ich 'beginEditing und endEditing entferne, stürzt es auf der removeAttribute Linie ab. Ich benutze [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f]; über meine App, und es funktioniert überall, außer in der UITextView.

Wer sieht, was schief läuft und wie ich es beheben könnte?

EDIT: hier ist der Backtrace:

(lldb) bt 
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x10f3c0060) 
    frame #0: 0x000000010c77f29d libobjc.A.dylib`realizeClass(objc_class*) + 145 
    frame #1: 0x000000010c783125 libobjc.A.dylib`lookUpImpOrForward + 127 
    frame #2: 0x000000010c792554 libobjc.A.dylib`_objc_msgSend_uncached + 68 
    frame #3: 0x0000000118d39ce7 UIFoundation`-[NSGlyphGenerator generateGlyphsForGlyphStorage:desiredNumberOfCharacters:glyphIndex:characterIndex:] + 251 
    frame #4: 0x0000000118d06d47 UIFoundation`-[NSLayoutManager(NSPrivate) _fillGlyphHoleForCharacterRange:startGlyphIndex:desiredNumberOfCharacters:] + 736 
    frame #5: 0x0000000118d091b0 UIFoundation`_NSFastFillAllGlyphHolesForCharacterRange + 726 
    frame #6: 0x0000000118d47f2e UIFoundation`-[NSLayoutManager glyphRangeForCharacterRange:actualCharacterRange:] + 64 
    frame #7: 0x0000000118d071af UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleForCharacterRange:desiredNumberOfLines:isSoft:] + 617 
    frame #8: 0x0000000118d08e9a UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleAtIndex:desiredNumberOfLines:] + 208 
    frame #9: 0x0000000118d0954a UIFoundation`-[NSLayoutManager(NSPrivate) _markSelfAsDirtyForBackgroundLayout:] + 325 
    frame #10: 0x0000000118d13d10 UIFoundation`-[NSLayoutManager(NSPrivate) _invalidateLayoutForExtendedCharacterRange:isSoft:invalidateUsage:] + 2212 
    frame #11: 0x0000000118d44743 UIFoundation`-[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 226 
    frame #12: 0x0000000118d448f9 UIFoundation`-[NSLayoutManager processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:] + 47 
    frame #13: 0x0000000118d6c216 UIFoundation`-[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 168 
    frame #14: 0x0000000118d6bd4c UIFoundation`-[NSTextStorage processEditing] + 372 
    frame #15: 0x0000000118d6b995 UIFoundation`-[NSTextStorage endEditing] + 83 
    * frame #16: 0x000000010bee435b MyApp`-[MyUITextView updateFonts](self=0x00007fc26208c000, _cmd="updateFonts") at MyUITextView.m:107 
+0

Womit stürzt es ab? Nichts im Konsolenprotokoll? –

+0

Nichts, aber ich habe gerade das Backtrace hinzugefügt. – Koen

Antwort

0

OK, ich löste es.

Ich verwende eine Hilfsklasse, um die Objekte , NSTextContainer und NSLayoutManager zu behandeln. Bei der Erstellung MyTextView habe ich nicht an das Hilfsobjekt gehalten (Ich habe nur die textContainer zu init von MyTextView übergeben). Ich habe jetzt das Hilfsobjekt ein @propertyMyTextView gemacht, so dass es eine starke Referenz hat, und der Absturz ist weg.