アプリにシンタックスハイライトを追加する作業をしています。テストクラスでは、現在NSTextView
、textDidChange
通知があります。これに似ています:
-(void)textDidChange:(NSNotification *)notification
{
[self highlightText];
}
NSTextView
ハイライトテキストの機能は、解析から文字列を取得してを作成しNSMutableAttributedString
、最後に文字列を表示します。コードは次のようなものです:(私はParseKitを使用して解析を行います。以下のサンプルはコードコメントを強調しています)。
- (void) highlightText
{
NSMutableAttributedString * resultString = [[NSMutableAttributedString alloc] initWithString: inputTextView.string];
PKTokenizer *t = [PKTokenizer tokenizerWithString: inputTextView.string];
[t setTokenizerState: t.quoteState from: '[' to: ']'];
// We want comments
t.commentState.reportsCommentTokens = YES;
[t enumerateTokensUsingBlock: ^(PKToken * token, BOOL * stop)
{
// Comments take presidense.
if(token.isComment)
{
[resultString addAttribute: NSForegroundColorAttributeName
value: [self commentColor]
range: NSMakeRange(token.offset, token.stringValue.length)];
}
}];
// Monospace
[resultString addAttribute: NSFontAttributeName
value: [NSFont userFixedPitchFontOfSize:0.0]
range: NSMakeRange(0, inputTextView.string.length)];
[[inputTextView textStorage] setAttributedString: resultString];
}
これで、少量のテキストで作業している場合は正常に機能しますが、大量のテキストで作業している場合はパフォーマンスを向上させたいと思います。私はこのテーマについて2つの考えを持っていました:
- バックグラウンドで処理を行います。ユーザーが入力すると、これはテキストが数秒間フォーマット解除される可能性があることを意味します。私はこの考えが本当に好きではありません。
- テキストの表示されているセクションでのみ強調表示を実行します。ユーザーがスクロールするときに、さらに強調表示を行います。これには、ユーザーがスクロールすると、テキストがフォーマットされていないが、フォーマットされたスタイルにゆっくりとポップするという問題があります。
この分野について何か提案はありますか?これを行う別の方法がありませんか、それともこれでうまくいくはずですか?誰かが似たような/より良いことをしているサンプルコードを知っている可能性がありますか?私は現在、オプション#2に行くことを考えています。