2012-05-05 8 views
1

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

どのようにnsviewについてですか?

答えて

3

または、カスタムNSBoxを持っている場合は、NSViewのの-hitTest上書きすることができます:すべてのサブビューにイベントを送信からウィンドウを停止するには(条件付き)

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

を。

視覚的なフィードバックを提供するために、カスタムNSBoxの-drawRectメソッドで何らかのオーバーレイを条件付きで描画すると機能します。

+0

これはユーザーに視覚的なフィードバックを提供しませんか?私はそれが混乱するかもしれないと思う(あなたが警告や何かを投げていない限り)。 – rdelmar

+0

いいえ、視覚的なフィードバックはありません(カスタム図面を使用しない限り)ので、ほとんどの使用例ではおそらく答えが良いでしょう。 – Vervious

5

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

+0

素晴らしいアイデアを有効/ NSBoxを含む最も一般的なUIコントロールを、無効に書いた迅速なC形式の関数です。ありがとう。 –

1

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

は、ここで私は...

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); 
     } 
    } 
} 
関連する問題