2012-06-22 3 views
10

Wenn ich den folgenden Code ausführen, stürzt es in der letzten Zeile ab. Ich habe keine Ahnung warum. Diese Funktion wird in watchFromNib aufgerufen.Warum stürzt [NSTextStorage setAttributedString] mit NSMutableAttributedString ab?

- (void)setMotdText:(NSString *)text 
{ 
    NSString *boldFontName = [[NSFont boldSystemFontOfSize:12] fontName]; 
    NSMutableAttributedString *attrstr = [[NSMutableAttributedString alloc] initWithString:text]; 

    [attrstr beginEditing]; 

    [attrstr addAttribute:NSFontAttributeName value:boldFontName range:NSMakeRange(0, 16)]; 

    [attrstr endEditing]; 

    [self.motdTextView.textStorage setAttributedString:attrstr]; 
} 

Ich erhalte diese Crash-Protokoll:

2012-06-22 11:32:22.348 MSM-Plan[20785:403] -[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380 
2012-06-22 11:32:22.349 MSM-Plan[20785:403] An uncaught exception was raised 
2012-06-22 11:32:22.349 MSM-Plan[20785:403] -[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380 
2012-06-22 11:32:22.351 MSM-Plan[20785:403] (
    0 CoreFoundation      0x00007fff8a5bef56 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff8ae19d5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff8a64b1be -[NSObject doesNotRecognizeSelector:] + 190 
    3 CoreFoundation      0x00007fff8a5abe23 ___forwarding___ + 371 
    4 CoreFoundation      0x00007fff8a5abc38 _CF_forwarding_prep_0 + 232 
    5 AppKit        0x00007fff8e0b060c -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixFontAttributeInRange:] + 1249 
    6 AppKit        0x00007fff8e0afeb7 -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixAttributesInRange:] + 64 
    7 AppKit        0x00007fff8e19b521 -[NSTextStorage processEditing] + 107 
    8 AppKit        0x00007fff8e0c2564 -[NSTextStorage edited:range:changeInLength:] + 385 
    9 Foundation       0x00007fff8d6f4497 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 328 
    10 AppKit        0x00007fff8e1dfd19 -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 81 
    11 MSM-Plan       0x000000010206af5a -[MSM_PlanAppDelegate setMotdText:] + 314 
    12 MSM-Plan       0x000000010206c455 -[MSM_PlanAppDelegate awakeFromNib] + 1701 
    13 CoreFoundation      0x00007fff8a5b5fb1 -[NSObject performSelector:] + 49 
    14 CoreFoundation      0x00007fff8a5b5f32 -[NSSet makeObjectsPerformSelector:] + 274 
    15 AppKit        0x00007fff8e0369ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 
    16 AppKit        0x00007fff8e02cf73 loadNib + 322 
    17 AppKit        0x00007fff8e02c470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217 
    18 AppKit        0x00007fff8e02c38b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141 
    19 AppKit        0x00007fff8e02c2ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 
    20 AppKit        0x00007fff8e29d06f NSApplicationMain + 398 
    21 MSM-Plan       0x000000010206adf2 main + 34 
    22 MSM-Plan       0x000000010206adc4 start + 52 
) 
2012-06-22 11:32:22.416 MSM-Plan[20785:403] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff8a5bef56 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff8ae19d5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff8a64b1be -[NSObject doesNotRecognizeSelector:] + 190 
    3 CoreFoundation      0x00007fff8a5abe23 ___forwarding___ + 371 
    4 CoreFoundation      0x00007fff8a5abc38 _CF_forwarding_prep_0 + 232 
    5 AppKit        0x00007fff8e0b060c -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixFontAttributeInRange:] + 1249 
    6 AppKit        0x00007fff8e0afeb7 -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixAttributesInRange:] + 64 
    7 AppKit        0x00007fff8e19b521 -[NSTextStorage processEditing] + 107 
    8 AppKit        0x00007fff8e0c2564 -[NSTextStorage edited:range:changeInLength:] + 385 
    9 Foundation       0x00007fff8d6f4497 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 328 
    10 AppKit        0x00007fff8e1dfd19 -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 81 
    11 MSM-Plan       0x000000010206af5a -[MSM_PlanAppDelegate setMotdText:] + 314 
    12 MSM-Plan       0x000000010206c455 -[MSM_PlanAppDelegate awakeFromNib] + 1701 
    13 CoreFoundation      0x00007fff8a5b5fb1 -[NSObject performSelector:] + 49 
    14 CoreFoundation      0x00007fff8a5b5f32 -[NSSet makeObjectsPerformSelector:] + 274 
    15 AppKit        0x00007fff8e0369ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 
    16 AppKit        0x00007fff8e02cf73 loadNib + 322 
    17 AppKit        0x00007fff8e02c470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217 
    18 AppKit        0x00007fff8e02c38b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141 
    19 AppKit        0x00007fff8e02c2ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 
    20 AppKit        0x00007fff8e29d06f NSApplicationMain + 398 
    21 MSM-Plan       0x000000010206adf2 main + 34 
    22 MSM-Plan       0x000000010206adc4 start + 52 
) 
terminate called throwing an exception(lldb) 

Hat jemand eine Idee? Wenn ich es mit einem NSAttributedString-Objekt anrufe gibt es keinen Fehler.

Antwort

18

Ich hatte die erste Zeile zu ändern:

NSFont *boldFont = [NSFont boldSystemFontOfSize:12]; 

Jetzt funktioniert es, weil der Wert Attribut ein NSFont-Objekt und nicht ein NSString mit dem Namen Schriftart erfordert.

Dies ist der Arbeits Code:

- (void)setMotdText:(NSString *)text 
{ 
    NSFont *boldFont = [NSFont boldSystemFontOfSize:12]; 
    NSMutableAttributedString *attrstr = [[NSMutableAttributedString alloc] initWithString:text]; 

    [attrstr beginEditing]; 

    [attrstr addAttribute:NSFontAttributeName value:boldFont range:NSMakeRange(0, 16)]; 

    [attrstr endEditing]; 

    [self.motdTextView.textStorage setAttributedString:attrstr]; 
} 
+0

Argh, machte ich den gleichen Fehler :). "NSFontAttributeName" ist NICHT das name-Attribut einer Schriftart; Es ist der Name eines Font-Attributs. Das neue Benennungsschema von Apple vermeidet diese Fehler (z. B. sollte diese API etwas wie "kFontAttribute" verwenden), aber ich denke, dass wir jetzt für immer mit den alten schlechten API-Namen festhalten :( – Adam