18

ココアの場合、NSTableViewをビューベースに設定しています。行を選択すると、テキストフィールドの色が白に変わります。どうすれば黒く保つことができますか?

また、ハイライトがソースリストに設定されていることにも注意してください(通常でも同じことを行います)。 ハイライト設定

選択されていない行未選択

選択した行選択した行

私はiOSの状態設定に似たものを望んでいました:

ここに画像の説明を入力してください

これはWWDC2011セッション120で提案されましたが、少し遅れているため、使用しません。しかし、それは他の誰かのために働くかもしれません。

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    [tableView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){
        NSTableCellView *cellView = [rowView viewAtColumn:0];
        if(rowView.selected){
            cellView.textField.font = [NSFont boldSystemFontOfSize:14];
        }else{
            cellView.textField.font = [NSFont systemFontOfSize:14];
        }
    }];
}
4

7 に答える 7

18

それを実現するためにカスタムコードは必要ありません。

InterfaceBuilderでラベルの色を「ラベルの色」に設定するだけです。自動白/黒は、ラベルに「コントロールテキストの色」が設定されており、NSTableCellViewにある場合にのみ機能します。

于 2015-04-16T11:57:01.037 に答える
17

これを行う必要がある理由に応じて、2つのアプローチがあります。

サブクラス化NSTableRowViewしてオーバーライド-[NSTableRowView interiorBackgroundStyle]し、を返すことができますNSBackgroundStyleLight。これにより、セルが明るい背景にあることと、黒になる暗いテキストを描画することがセルに通知されます。

もう1つの方法は、サブクラス化NSTableCellViewしてオーバーライド-[NSTableCellView setBackgroundStyle:]し、そこで自分で色を設定することです。

于 2012-08-17T14:52:38.863 に答える
14

NSTableCellViewをオーバーライドし、このメソッドを追加して、セルが選択されたときにテキストの色を変更します。

- (void) setBackgroundStyle:(NSBackgroundStyle)backgroundStyle
{
    NSTableRowView *row = (NSTableRowView*)self.superview;
    if (row.isSelected) {
        self.textField.textColor = [NSColor blackColor];
    } else {
        self.textField.textColor = [NSColor whiteColor];
    }

}
于 2014-02-11T19:23:29.050 に答える
3

私は別の解決策を思いついた。Cocoaが@IBOutletCollectionをサポートしていれば、NSTableCellViewのサブクラス化は問題ありませんでした。その場合、セル内のすべてのNSTextFieldの配列を持つ1つのCellサブクラスを持つことができるためです。しかし、NSTextFieldの数が異なる多くの種類のセルがあったため、このオプションは気に入らなかった。代わりに、backgroundStyleNSTableCellViewのプロパティに関するAppleのドキュメントを調べました。

デフォルトの実装では、setBackgroundStyleを実装するすべてのサブビューに呼び出しが自動的に転送されます。またはNSControlであり、backgroundStyleに応答するNSCellクラスがあります。

TextFieldsがsetBackgroundStyleを実装している場合、セルの選択が変更されたときに通知を受け取る必要があります。ただし、この背景スタイルの転送は再帰的ではありません。NSTextFieldsがNSStackViews内にあったため、メッセージを受信して​​いませんでした。これを回避するために、すべてのNSViewにsetBackgroundStyleを実装する拡張機能を作成しました。メッセージを転送するだけです。最後に、NSTextFieldに拡張機能を追加して、このメソッドも実装しました。この拡張機能から、テキストの色を変更してスーパーと呼びます。サブクラスが必要ないため、このソリューションも優れています。NSTableCellViewまたはNSTextFieldのサブクラスはありません。

この機能をすべてのビューとすべてのNSTextFieldsに追加すると、NSTableViews内にないNSTextFieldsが予期せず色を変更するという問題が発生する可能性があります。しかし、これまでのところ、TableViews / OutlineViews内のものだけが色を変えており、まさにそれが私が探していたものです。予期しない色のテキストフィールドの変更が見られる場合は、NSTextFieldをサブクラス化し、すべてのNSTextFieldに追加するのではなく、そのサブクラスにのみsetBackgroundStyleオーバーライドを実装することをお勧めします。

私が使用したSwift3のコードは以下に貼り付けられています。

extension NSView {
    func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
        for view in self.subviews {
            view.setBackgroundStyle(newValue)
        }
    }
}

extension NSTextField {
    override func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
        switch newValue {
        case .dark:
            self.textColor = NSColor.controlLightHighlightColor
        case .light, .lowered, .raised:
            self.textColor = NSColor.labelColor
        }
        super.setBackgroundStyle(newValue)
    }
}
于 2017-01-27T17:40:54.933 に答える
2

私のSwiftアプリの場合、上記のどれも正しく機能していないようです。このメソッドは、フォーカスを失ったNSTableViewを正しく処理し、ウィンドウがキーウィンドウではないが、セルがまだ選択されている場合に処理します。

NSTableCellViewサブクラス内で以下を使用します。

override var backgroundStyle: NSView.BackgroundStyle {
  willSet {
    if newValue == .dark {
      title.textColor = NSColor.white
    } else {
      title.textColor = NSColor.labelColor
    }
  }
}
于 2017-09-27T11:57:10.023 に答える
0

@sabesの回答に基づいてNSTextFieldCell、行が選択または選択解除されたときにカスタムテキストの色を設定するために使用できるこのサブクラスを作成しました。IBで関連するテキストフィールドセルのサブクラスを設定できます。

@interface SNBlueTextFieldCell : NSTextFieldCell

@end

@implementation SNBlueTextFieldCell

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
    [self setTextColor:(backgroundStyle==NSBackgroundStyleDark ? [NSColor blackColor] : [NSColor blueColor])];
}

@end
于 2015-07-01T16:48:56.863 に答える
0

macOS 11以降では、.darkおよび.light背景スタイルは非推奨になりました。.emphasedただし、代わりに使用できます。

override var backgroundStyle: NSView.BackgroundStyle {
    willSet {
        textField.textColor = newValue == .emphasized ? .labelColor : .secondaryLabelColor
    }
}

この例で.labelColorは、は選択された色と.secondaryLabelColor選択されていない色です。

于 2021-02-18T12:17:11.043 に答える