1

NSBox にいくつかのコントロール (ボタン、テキストフィールドなど) を配置しました。ユーザーがコントロールにアクセスできない NSBox を無効にすることは可能ですか (ボタンをクリックしたり、テキストフィールドに書き込んだりできません)?

nsview はどうですか?

4

3 に答える 3

5

NSBox は基本的に境界線のある単なるビューであり、それを「無効にする」方法はありません。ボックス内のすべてのコントロールを無効にする場合は、そのすべてのサブビューをループして無効にするか、別の方法として、ボックス全体にオーバーレイ ビューを配置し、そのオーバーレイで mouseDown をオーバーライドします (キャプチャするため)。イベント ループでキューに入れられないようにするすべての mouseDown イベント)。オーバーレイに半透明の白色を指定して、ボックスの外観を無効にすることもできます。

于 2012-05-05T15:22:26.313 に答える
3

または、カスタム NSBox がある場合は、NSView の -hitTest: (条件付き) をオーバーライドできます。

- (NSView *)hitTest:(NSPoint)aPoint {
    if (!enabled) return nil;
    else return [super hitTest:aPoint];
}

ウィンドウがすべてのサブビューにイベントを送信しないようにします。

視覚的なフィードバックを提供するには、カスタム NSBox の -drawRect メソッドである種のオーバーレイを条件付きで描画するとうまくいきます。

于 2012-05-05T16:34:33.750 に答える
1

はい、通常は 1 つの NSView である NSBox のサブビューを見るだけでよく、実際のコントロールはそのサブビューの下にあります。

これは、NSBoxを含む最も一般的なUIコントロールを有効/無効にするために私が書いた簡単なCスタイルの関数です...

void SetObjEnabled(NSObject * Obj, bool Enabled)
{
    //Universal way to enable/disable a UI object, including NSBox contents

    NSControl * C = (NSControl *)Obj;

    if([C respondsToSelector:@selector(setEnabled:)])
        [C setEnabled:Enabled];

    if([C.className compare:@"NSTextField"] == NSOrderedSame)
    {
        NSTextField * Ct = (NSTextField*)C;
        if(!Enabled)
            [Ct setTextColor:[NSColor disabledControlTextColor]];
        else //Enabled
            [Ct setTextColor:[NSColor controlTextColor]];
    }
    else if([C.className compare:@"NSBox"] == NSOrderedSame)
    {
        NSBox * Cb = (NSBox*)C;

        //There is typically just one subview at this level
        for(NSView * Sub in Cb.subviews)
        {
            //Here is where we'll get the actual objects within the NSBox
            for(NSView * SubSub in Sub.subviews)
                SetObjEnabled(SubSub, Enabled);
        }
    }
}
于 2013-01-08T20:52:52.293 に答える