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を使用しているので、パーサーから返された属性付きの文字列は、CoreTextをいじる代わりに、UITextViewに簡単に追加できると考えています。これを念頭に置いて、上記のコードを次のように変更しました。
- (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 に設定する行で「不明なセレクターがインスタンスに送信されました」というエラーが生成されます。パーサーから返された属性付きの文字列が原因であると確信していますが、その理由を一生理解することはできません! そこに何かアイデアはありますか?
実行時のコンソールのスクリーンショットを次に示します。
次の画像は、問題を引き起こしているattStringという名前のAttributedStringの詳細のスクリーンショットです
最後に、コードの次のセクションは、パーサーが属性を設定する場所であり、上記のデバッガーに示されている 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 と関係があることは知っていますが、実際には理解していないため、これらが問題を引き起こしているかどうかはわかりません。