5

ソースリストスタイルのNSOutlineViewを使用しており、(セルベースではなく)ビューベースのアウトラインビューを使用しています。

いくつかの行を太字にできるようにしたいと思います。ただし、フォントを変更しようとする試み(手動でIB、viewForTableColumn:…のコード、またはFont Boldバインディングを使用)は、これまで無視されてきました。

このメッセージから、これはNSOutlineViewのソースリストスタイルがテキストフィールドの外観の管理を引き継ぐためであると思われます。

テキストフィールドをNSTableCellViewのtextFieldアウトレットに接続したと思いますか?もしそうなら、NSTableViewのソースリストの外観の自動管理に遭遇しているのではないかと思います。

テキストフィールドをtextFieldアウトレットから切断して、カスタムフォントが固定されるかどうかを確認してください。

textFieldアウトレットを切断すると、外観が制​​御され、大胆に機能します。

しかし、今では自動のように見せることができません。つまり、NSOutlineViewがテキストフィールドの外観を管理しているとき、フォントは太字で、アイテムが選択されたときにドロップシャドウが表示されましたが、手動で管理しているときはそうではありません。

誰かがこれらの質問のいずれかに答えることができますか?

  1. NSOutlineViewがテキストフィールドの外観を管理しているときに、FontBoldバインディングを機能させるにはどうすればよいですか。
  2. NSOutlineViewでテキストフィールドの外観を管理していない場合、どうすればテキストフィールドを管理していた場合と同じように表示および動作させることができますか?
4

2 に答える 2

7

私は解決策を見つけたと思います:

NSTableCellView含まれているコントロールのセルにプロパティをtextField設定することにより、アウトレットの外観を管理します。backgroundStyleこれを設定すると、基本的にを設定し、テキストの色を変更し、を介してシャドウを追加するNSBackgroundStyleDark特別なパスがトリガーされます。NSTextFieldCellattributedStringValueNSShadowAttributeName

あなたができることは2つのことです:

  • backgroundStyleカスタム行またはセルビューサブクラスで独自に設定します。
  • NSTextFieldCellセルのテキストフィールドでカスタムを使用して、動作/描画を変更します。

テーマのある(異なる色の)テーブルビューに別の外観が必要だったため、後者を実行しました。このために私たちが見つけた最も便利な(確かに最も効率的ではありませんが)場所は- drawInteriorWithFrame:inView:、superを呼び出す前にセルの属性文字列をオーバーライドおよび変更し、後で元の文字列を復元することでした。

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSAttributedString *originalString = self.attributedStringValue;

    // Customize string as you like
    if (/* whatever */)
        [self setAttributedStringValue: /* some string */];

    // Regular drawing
    [super drawInteriorWithFrame:cellFrame inView:controlView];

    // Reset string
    if (self.attributedStringValue != originalString)
        self.attributedStringValue = originalString;
}

これが同様の状況で他の人を助けるかもしれないことを願って。

于 2013-03-12T22:05:39.287 に答える
0

私があなたの質問で何かを逃したかどうかはわかりませんが、以下を使用してフォントを変更することは私にとってはうまくいきます。ReminderTableCellViewNSTableCellViewのサブクラスであり、dateFieldが追加されています。

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    //LOG(@"viewForTableColumn called");
    // For the groups, we just return a regular text view.
    if ([_topLevelItems containsObject:item]) {
        //LOG(@" top level");
        NSTableCellView *result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
        // Uppercase the string value, but don't set anything else. NSOutlineView automatically applies attributes as necessary
        NSString *value = [item uppercaseString];
        [result.textField setStringValue:value];
        //[result.textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
        return result;
    } else  {
        //LOG(@" menu item");
        // The cell is setup in IB. The textField and imageView outlets are properly setup.
        // Special attributes are automatically applied by NSTableView/NSOutlineView for the source list
        ReminderTableCellView *result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
        if ([item isKindOfClass:[OSTreeNode class]]) {
            [result.textField setFont:[NSFont boldSystemFontOfSize:13]];
            result.textField.stringValue = [item displayName];
            result.dateField.stringValue = [item nextReminderDateAsString];
        }
        else
            result.textField.stringValue = [item description];
        if (_loading)
            result.textField.textColor = [NSColor grayColor];
        else
            result.textField.textColor = [NSColor textColor];
        NSImage *image = [NSImage imageNamed:@"ReminderMenuIcon.png"];
        [image setSize:NSMakeSize(16,16)];
        [result.imageView setImage:image];
        //[result.imageView setImage:nil];
        return result;
    }
}

結果のビューを以下に示します。これは、ソースリストオプションが選択されたNSOutlineViewですが、これが通常のoutlineViewで機能しない理由がわかりません。

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

于 2013-09-14T00:08:20.743 に答える