2012-09-21 5 views
13

Ich bin die große TTTAttributedLabel mit (https://github.com/mattt/TTTAttributedLabel), die unter iOS 5. Unter iOS 6 aber gut funktioniert, erhalte ich die Fehlermeldung:(NSCFType set) - Nicht erkannte Wähler in iOS 6

-[__NSCFType set]: unrecognized selector sent to instance 0x200020e0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '- [__NSCFType set]: unrecognized selector sent to instance 0x200020e0' 

die erforscht Nachdem Geben Sie ein wenig aus, scheint es so, als würde die gesetzte Nachricht an ein Objekt gesendet, das freigegeben wurde. Unter Verwendung des Debuggers habe ich 0x200020e0 angezeigt, was ein CTFontRef zu sein scheint.

po 0x200020e0 
(int) $0 = 536879328 CTFont <name: .HelveticaNeueUI-Bold, size: 20.000000, matrix: 0x0> 
CTFontDescriptor <attributes: <CFBasicHash 0x20001900 [0x3c2a4100]>{type = mutable dict, count = 1, 
entries => 
1 : <CFString 0x3be2a768 [0x3c2a4100]>{contents = "NSFontNameAttribute"} = <CFString 0x3c292c14 [0x3c2a4100]>{contents = ".HelveticaNeueUI-Bold"} 

}

Dies führte mich direkt auf den Code, der die TTTAttributedLabel aufstellt:

[label setText:text afterInheritingLabelAttributesAndConfiguringWithBlock:^ NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) { 
    NSRange boldRange = [[mutableAttributedString string] rangeOfString:title options:NSCaseInsensitiveSearch]; 
    NSRange strikeRange = [[mutableAttributedString string] rangeOfString:@"sit amet" options:NSCaseInsensitiveSearch]; 


    UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:20]; 

    CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL); 

    if (font) { 
     [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)font range:boldRange]; 
     [mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(__bridge id)font range:boldRange]; 
     CFRelease(font); 
    } 

    return mutableAttributedString; 
}]; 

wie im Beispiel für die Verwendung hier:

https://github.com/mattt/TTTAttributedLabel

Dieser Code ist nicht arcifiziert, also habe ich in überbrückte Casts hinzugefügt (siehe oben). Ich habe versucht, behält überall, aber das scheint nicht das Problem zu lösen (was zu sein scheint), dass die CTFontRef zu früh freigegeben wird (ich denke - andere Vorschläge willkommen).

Irgendwelche Ideen, wie man das löst und warum das nur unter dem iOS 6 Simulator auftaucht? Danke im Voraus.

Antwort

4

Am Ende war es nur ein dummer Fehler -

[mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(__bridge id)font range:boldRange]; 

sollte gelesen haben:

[mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[UIColor blueColor].CGColor range:boldRange]; 
2

Ich habe den gleichen Fehler gefunden, wenn ich eine UILabel myLabel, und tun myLabel.attributedText = NSMutableAttributedString.

Versuchen https://github.com/AliSoftware/OHAttributedLabel

Deklarieren:

@property (nonatomic, strong) IBOutlet OHAttributedLabel *myLabel;

statt UILabel den Fehler behebt.

7

Ersetzt:

CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL); 

mit:

UIFont *font = [UIFont fontWithName:boldSystemFont.fontName size:boldSystemFont.pointSize]; 

das Problem in iOS6 für mich behoben. Nicht auf iOS getestet 5.

1

ich es geschafft, diesen Fehler zu bekommen, wenn ich einen schlechten wurde mit Bereich Hinzufügen von Attributen zu einem NSMutableAttributedString. Fixing der Bereich behoben den Absturz!

BEARBEITEN: Auch geschafft, es zu erhalten, indem Sie UITextAttributeFont im Attributewörterbuch verwenden, das offenbar jetzt in iOS 7 veraltet ist, das gerade Dinge auf mysteriöse Weise zum Absturz bringt. Der Ersatz ist NSForegroundColorAttributeName.

+0

Sorry, gerade bemerkt, dass die Bearbeitung dort nicht viel Sinn macht .. Kann mich nicht erinnern, welche Schlüssel ich meinte, aber Sie könnten in Ihrer Situation herausfinden. Verwenden Sie grundsätzlich keine veralteten Schlüssel! – CMash