Подтвердить что ты не робот

(Набор NSCFType) - Непризнанный селектор в iOS 6

Я использую отличный TTTAttributedLabel (https://github.com/mattt/TTTAttributedLabel), который отлично работает под iOS 5. Однако в 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'

Немного исследов проблему, оказалось, что заданное сообщение отправляется на объект, который был выпущен. Используя отладчик, у меня есть po'd 0x200020e0, который, как представляется, является CTFontRef.

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"}

}

Это сразу привело меня к коду, который устанавливает TTTAttributedLabel:

 [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;
}];

как в примере использования здесь:

https://github.com/mattt/TTTAttributedLabel

Этот код не ARCified, поэтому я добавил в мосты (см. выше). Я попытался сохранить все места, но это, похоже, не решает проблему (которая, кажется,), что CTFontRef становится выпущенным слишком рано (я думаю, что другие предложения приветствуются).

Любые идеи о том, как решить эту проблему и почему это происходит только под симулятором iOS 6? Спасибо заранее.

4b9b3361

Ответ 1

В конце концов, это была просто глупая ошибка -

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

должен читать:

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

Ответ 2

Заменены:

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

с:

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

Исправлена ​​проблема в iOS6 для меня. Не тестировалось на iOS 5.

Ответ 3

Я столкнулся с той же ошибкой, когда у меня есть UILabel myLabel, и делает myLabel.attributedText = NSMutableAttributedString.

Попробуйте https://github.com/AliSoftware/OHAttributedLabel

Объявление:

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

вместо UILabel решает ошибку.

Ответ 4

Мне удалось получить эту ошибку, когда я использовал плохой диапазон, добавляя атрибуты в NSMutableAttributedString. Фиксация диапазона исправила сбой!

EDIT: также удалось получить его с помощью UITextAttributeFont в словаре атрибутов, который, по-видимому, теперь устарел в iOS 7, который просто заставляет загадки загадок. Заменой является NSForegroundColorAttributeName.