内にカスタムビューがありNSPopover
ます。ユーザーの入力に応じて変更する必要があり、ユーザーが最初に操作したときは変更されますが、次の回は再描画に失敗します。
NSLog
メソッド内に を入れようとしましたが、-drawRect:
通常の実行中に呼び出されません。メソッド内にブレークポイントをデバッグして配置しようとすると、通常どおり呼び出され、アプリは正常に動作します。
-setNeedsDisplay:
再描画が必要になるたびに、view メソッドを明示的に呼び出します。なぜそれが違いを生む必要があるのか わかりません。
ビューのステータスを更新するコードを次に示します。これらのメソッドはNSTextField
デリゲート メソッドの一部であり-textDidChange:
、ユーザーがポップオーバーに関連付けられたテキスト フィールドに何かを入力するたびに呼び出されることを確認しました。
[tokenCloud tokensToHighlight:[NSArray arrayWithObject:completeSuggestionString]];
tokenCloud.tokens = filteredTokens;
[tokenCloud setNeedsDisplay:YES];
ビューは一連の凹んだボタンです。最初の行はポップオーバー内のすべてのボタンのステータスを更新し、2 番目の行はボタンの追加または削除を更新します。最初に呼び出されたときにビューが適切に更新されるため、両方とも適切に機能します。tokenCloud
ボタンのステータスとそのプロパティのtokens
両方が正しく更新されていることも確認しました。問題は、NSView
サブクラスtokenCloud
が再描画されないため、変更が 2 回目に UI に反映されないことです。
ビューの draw メソッドは次のとおりです。
- (void)drawRect:(NSRect)rect {
[self recalculateButtonLocations];
NSLog(@"Redrawn");
}
にブレークポイントを配置すると、ビューを更新するたびにこのメソッドが正常に呼び出されます[self recalculateButtonLocations];
。代わりに、アプリを通常どおり実行すると、ビューを 2 回目に更新したときにコンソールに何も記録されません。NSLog
メソッドにを含めた場合も同じでrecalculateButtonLocations
、2 回目は何もログに記録されず、メソッドが呼び出されないことを意味します。