1

私の MacOS Cocoa アプリケーションは、静的テキストのウィンドウを表示します。つまり、ユーザーが変更してはならず、ファーストレスポンダなどであってはなりません。テキストに発生する唯一のことは、特定の時点でその各単語の色が (「idleColor」から「highlightColor」に、そして再び元に戻る) 変わることです。これはカラオケのディスプレイに似ています。時間指定されたイベントのリストに基づいて、プログラムの制御下で個々の単語の色が変わり、元に戻ります。

これらはすべて、MacOS 10.7 および 10.8 で美しく機能します。ただし、10.9 では、ウィンドウをクリックしてカーソルを継続的に移動しない限り、テキストの色は変更されません。これを行うと、通常の単語は意図したとおりに動作します。基本的に、UI の応答を必要とする何かを手動で実行して強制的に更新しない限り、OS がプログラム制御下でウィンドウを更新することを拒否しているように感じます。

色の変更を実行するコードは次のとおりです。

if (sEvent.attribute == HIGHLIGHT_ON) {
    [sTextView setTextColor:highlightColor range: currentRange];
    textIsLitUp = YES;
    }
else {
    [sTextView setTextColor:idleColor range: currentRange];
    textIsLitUp = NO;
    }
[sTextView setNeedsDisplay:YES];

(sTextView は NSTextView のサブクラスです。)

ここで、最後の行をコメントアウトすると、10.7 と 10.8 で同じ、正しくない動作が発生します。つまり、10.9 では、setNeedsDisplay メソッドが機能していないか、同じように機能していません。

これを回避するためのアイデアはありますか、または問題を解決するための他の光がありますか? それとも、私は何かひどく間違ったことをしていますか? アプリケーションにとって、textColor への変更がレイテンシーなしで行われることは非常に重要です。

質問の編集 - 回答するには:

ここで他の場所で答えを見つけました!メインスレッドでsetNeedsDisplayを呼び出す必要がありました-それはセカンダリスレッドにありました。奇妙なことに、10.7 および 10.8 では常に正常に動作しているように見えました。10.9未満でしか壊れませんでした。だから私はこれを変更しました:

[myTextField setNeedsDisplay:YES];

これに:

dispatch_async(dispatch_get_main_queue(), ^{[myTextField setNeedsDisplay:YES];});

…そしてそれはうまくいったようです。これが他の誰かに役立つことを願っています…</p>

4

1 に答える 1

2

非メイン スレッドで AppKit オブジェクトの変更を行う必要はありません。場合によっては、場合によっては頻繁に機能することもありますが、たまにクラッシュすることがあり、その理由を疑問に思うでしょう。そう:

[sTextView setTextColor:idleColor range: currentRange];

メインスレッドにもある必要があります。

于 2014-01-28T08:22:56.190 に答える