我试图将 Ray Wenderlich 的简单杂志教程中的解析器提升到我的项目中。他的解析器代码在这里: 如何使用核心文本创建一个简单的杂志应用程序
主控制器将文本字符串传递给解析器,解析器对其进行剖析,添加属性,然后返回属性字符串,在 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 有关,但我不太了解它们,所以不知道这些是否导致问题!