2011-07-29 5 views
7

セル(つまり行)が選択されたとき(たとえば、isHighlightedがtrue)、すべてが正常に機能するときにカスタムフォアグラウンドカラーを描画するために、NSTextFieldCell(NSTableViewの内側)をサブクラス化しました。NSTextFieldCellのisHighlightedがフォーカスを持たないときを特定する方法は?

問題は、テーブルビューがフォーカスを失ったときです。選択した行を別の色で描画したいのですが、セルを含むテーブルビューがdrawWithFrame内の最初のレスポンダでないかどうかを調べるにはどうすればよいですか。(NSRect)cellFrame inView:(NSView *)controlView?

私の現在のコードは、私がfirstResponderを使用して解決策を見つけた

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor = [self isHighlighted] 
       ? [NSColor alternateSelectedControlTextColor] 
       : [NSColor darkGrayColor]; 
} 
+0

は私も本当にこの答えをしたいキーである場合、あなたは確認する必要があります 複数のウィンドウを持っているがあれば、完璧です! –

答えて

5

ない私が見つけた最良の方法応答者に対処するようにしてください(controlViewのスーパービューがレスポンダーかナンセンスなので)。

BOOL isEditing = [(NSTextField *)[self controlView] currentEditor] != nil; 

簡単!

+1

質問はかなり古く、私はあなたがとても感謝、回答が受け入れられたと言うように解決しました:) – dafi

+0

また、ウィンドウがキーであることを確認しますか?それとも不要ですか? '&& [self.window isKeyWindow]' – Gabriel

3

あり、それは簡単で、効率的なようだ

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor; 

     if ([self isHighlighted]) { 
      textColor = [[controlView window] firstResponder] == controlView 
        ? [NSColor alternateSelectedControlTextColor] 
        : [NSColor yellowColor]; 
     } else { 
      textColor = [NSColor darkGrayColor]; 
     } 

     // use textColor 
     ... 
     ... 
     [super drawWithFrame:cellFrame inView:controlView]; 
    } 
+0

私はそれも見つけましたが、アプリケーションが無効になっている場合はチェックしません。良い方法がないと信じられない。 –

+1

「NSApplicationDidResignActiveNotification」と「NSApplicationDidBecomeActiveNotification」の通知に登録して、通知を処理するように設定したメソッドのテーブルビューで '-setNeedsDisplay:'を呼び出すだけです。 –

+0

また、Windowsがアクティブで非アクティブになるように登録すると思いますか?標準的なセルフォーカスのためにやりたいことはたくさんあるようです。 AppKitの中にもっと良い方法が隠されていなければなりません...あるいは、それをコンポーネント/カテゴリにカプセル化する時間です。 –

2

もう一つは、上記のコードは、あなたのウィンドウが

 if (controlView && ([[controlView window] firstResponder] == controlView) && [[controlView window] isKeyWindow]) { 
      [attributes setObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]; 
     } 
関連する問題