1

カスタムセルを定義し、メソッドをオーバーライドしたアプリケーションがあります - (void) drawWithFrame:inView:

この方法は、OS X 10.6 以前で Xcode 3.2 を使用してアプリをビルドしている限り、問題なくカスタム セルを描画していました。

現在、コードを移行して、OS X 10.8 で Xcode 4+ でビルドしようとしています。そして、私が見つけたのは、カスタムセルが描画されなくなったことです。ブレークポイントを配置し、デバッガーを介してアプリを実行した後、オーバーライドされた - (void) drawWithFrame:inView: カスタム セルのメソッドがまったく呼び出されていないことに気付きました。

私の質問は次のとおりです。

1) このメソッドが OS X 10.8 ではまったく呼び出されないのに、OS X 10.6 以前では呼び出されて完全に正常に動作するのはなぜですか?

2) この問題を解決するには、どのような代替手段が必要ですか?

ありがとう、ムリガンカ

4

2 に答える 2

0

OSX 10.7でxcode 4.xを使用していることを除いて、同じ問題が発生しています

多分それはxcode 4.xのものですか?

私が気付いたのは、サブクラス化された NSTextFieldCell の drawWithFrame は、親 NSTextField で setEnabled (YES から NO または NO から YES に変更) を呼び出したときに呼び出されないことです。 .

ただし、(サブクラス化された NSTextFieldCell を初期化した後に) setEnabled を呼び出しても変更が発生しない場合 (つまり、setEnabled:YES で既に YES に設定されている場合)、drawWithFrame が実際に呼び出されます。

残念ながら、サーバー呼び出しが行われている間は NSTextField を無効にしてから、コールバックで有効にしたいので、setEnabled を YES から NO から YES に実行する必要があります。コールバックが (たとえば、「パスワードが間違っている」) 場合は、NSTextFieldCell の境界線を赤くカスタム描画する必要があります..そして、drawWithFrame をオーバーライドしてこれを行う必要があります。

私の推測では、setEnabled は NSGraphicsContext を利用し、savesGraphicsState/restoreGraphicsState を実行して (おそらくエラーで)、NSTextFieldCell/drawWithFrame で利用されるグラフィックス コンテキストをスローします。

私の推測では、setEnabled 内の NSGraphicsContext は、変更が発生した場合 (setEnabled が YES から NO、または NO から YES) にのみ使用されます。変更が発生しない場合は問題がないため、これは理にかなっていると思います。ビューが選択可能または編集可能でないことをユーザーに示すために新しいグラフィックスをレンダリングしても意味がありません。

于 2013-05-25T06:16:37.817 に答える