2
我正在爲應用程序添加一些語法高亮顯示。在測試課上,我目前有NSTextView
和textDidChange
通知。與此相似:通過NSAttributedString提高NSTextView語法高亮性能
-(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。