Я попытался перенести в свой проект парсер из простого журнального учебника Рэя Вендерлиха. Его код парсера находится здесь: как создать простое приложение для журнала с основным текстом
Главный контроллер передает текстовую строку синтаксическому анализатору, который анализирует ее, добавляет атрибуты и затем возвращает строку с атрибутами, используя следующий код в viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"zombies" ofType:@"txt"];
NSString* text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
MarkupParser* p = [[[MarkupParser alloc] init] autorelease];
NSAttributedString* attString = [p attrStringFromMarkup: text];
[(CTView *)[self view] setAttString:attString withImages: p.images];
[(CTView *)[self view] buildFrames];
}
Поскольку я использую Ios6, я думаю, что атрибутивная строка, переданная обратно из парсера, может быть просто добавлена в UITextView вместо того, чтобы возиться с CoreText. Имея это в виду, я изменил приведенный выше код на следующий:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"zombies" ofType:@"txt"];
NSString* text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
MarkupParser* p = [[[MarkupParser alloc] init] autorelease];
NSAttributedString* attString = [p attrStringFromMarkup: text];
UITextView *view = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
view.attributedText = attString;
[self.view addSubview:view];
}
Однако теперь это приводит к ошибке «Неизвестный селектор отправлен в экземпляр» в строке, которая устанавливает для view.attributedText значение attString. Я уверен, что указанная строка, возвращенная парсером, виновата, но не могу понять, почему! есть какие-нибудь идеи?
Вот скриншот консоли во время выполнения:
Следующее изображение представляет собой снимок экрана с подробной информацией в AttributedString с именем attString, которая вызывает проблему.
И, наконец, в следующем разделе кода парсер устанавливает свои атрибуты, что может вызвать ошибку pointSize, показанную в отладчике выше.
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)CFBridgingRetain(self.font),
24.0f, NULL);
//apply the current text style
NSDictionary* attrs = [NSDictionary dictionaryWithObjectsAndKeys:
(id)self.color.CGColor, kCTForegroundColorAttributeName,
(id)CFBridgingRelease(fontRef), kCTFontAttributeName,
(id)self.strokeColor.CGColor, (NSString *) kCTStrokeColorAttributeName,
(id)[NSNumber numberWithFloat: self.strokeWidth], (NSString *)kCTStrokeWidthAttributeName,
nil];
[aString appendAttributedString:[[NSAttributedString alloc] initWithString:[parts objectAtIndex:0] attributes:attrs] ];
Команды "моста", указанные выше, были добавлены Xcode автоматически, я знаю, что это как-то связано с ARC, но я не совсем понимаю их и поэтому не знаю, вызывают ли они проблему!