4

アプリケーションの非常に中心的な部分として NSTableView があり、残りの部分とさらに統合したいと考えています。1 つの列 (リスト) しかなく、すべてのセル (通常の NSTextFieldCells) を自分で描画します。

最初の問題はハイライトです。自分でハイライトを描いて、青い背景を取り除きたいです。セル全体を元の背景色で塗りつぶして青い背景を非表示にしましたが、セルをドラッグすると見栄えが悪くなります。NSCell のオーバーライドを試みhighlight:withFrame:inView:ましhighlightColorWithFrame:inView:たが、何も起こりませんでした。自動強調表示を無効にするにはどうすればよいですか?

また、NSTableView の外のどこかをクリックしたときに、すべての行/セルの選択を解除したいと考えています。選択したセルの背景/ハイライトが灰色になるため、これにはイベントが必要ですが、見つかりません。ダブルクリックでセルを展開しますが、元に戻す必要がある場合があります。そのため、灰色のハイライトを取り除くだけでは不十分です。

編集:セルがダブルクリックされresignFirstResponder、NSTableView が呼び出されたときに、サブビューを NSTableView に追加します。私はこれを試しました:

- (BOOL)resignFirstResponder
{
    if (![[self subviews] containsObject:[[self window] firstResponder]])
    {
        [self deselectAll:self];
        ...
    }

    return YES;
}

機能していないことに加えて、ビュー階層内のすべてのオブジェクトに対してこのメ​​ソッドを実装する必要があります。ファーストレスポンダが特定のビュー階層を離れたときを見つけるための他の解決策はありますか?

4

3 に答える 3

2

同様のソリューションを実現したかった (NSOutlineView を使用しますが、これには違いはありません): アウトライン ビュー内をクリックするが、セルのある行ではなく (たとえば、ソース リストの空の下部)、現在選択されている行を選択解除します。最終的に、役立つかもしれないこの小さなコードに行き着きました。

NSOutlineView サブクラスでは、次のように記述しました。

@implementation ClickOutlineView

- (void)mouseDown:(NSEvent *)theEvent
{
    NSPoint pointInWindow = [theEvent locationInWindow];
    NSPoint pointInOutlineView = [self convertPoint:pointInWindow toView:nil];

    int rowIndex = [self rowAtPoint:pointInOutlineView];

    if ([theEvent clickCount] == 1 && rowIndex == -1) {
        [self deselectAll:nil];
    }
    else {
        [super mouseDown:theEvent];
    }
}

@end
于 2012-03-24T11:46:54.560 に答える
1

質問の投稿者を助けるには遅すぎることは間違いありませんが、これはGoogleでこれに出くわした他の人を助けるかもしれません(私がしたように)。

Xcode 4 の属性インスペクターの [ハイライト] ドロップダウン メニューで [なし] を選択すると、行の選択を防ぐことができます。

これをプログラムで設定するためのSO hereに関する回答もあります。

于 2013-01-10T07:05:37.050 に答える
0

過負荷-highlight:withFrame:inView:は正しいはずです。オーバーロードはどうしましたか?NSLog()ステートメントは、コードが実行されていることを示していますか? NSTableView も参照してください。こちらの-highlightSelectionInClipRect:方が便利かもしれません。

ユーザーがテーブル ビューの外側をクリックしたときに何らかの処理 (現在の選択を解除するなど) を行うには、-resignFirstResponderNSTableView をオーバーロードします。

于 2009-08-18T14:00:05.967 に答える