NSBox にいくつかのコントロール (ボタン、テキストフィールドなど) を配置しました。ユーザーがコントロールにアクセスできない NSBox を無効にすることは可能ですか (ボタンをクリックしたり、テキストフィールドに書き込んだりできません)?
nsview はどうですか?
NSBox は基本的に境界線のある単なるビューであり、それを「無効にする」方法はありません。ボックス内のすべてのコントロールを無効にする場合は、そのすべてのサブビューをループして無効にするか、別の方法として、ボックス全体にオーバーレイ ビューを配置し、そのオーバーレイで mouseDown をオーバーライドします (キャプチャするため)。イベント ループでキューに入れられないようにするすべての mouseDown イベント)。オーバーレイに半透明の白色を指定して、ボックスの外観を無効にすることもできます。
または、カスタム NSBox がある場合は、NSView の -hitTest: (条件付き) をオーバーライドできます。
- (NSView *)hitTest:(NSPoint)aPoint {
if (!enabled) return nil;
else return [super hitTest:aPoint];
}
ウィンドウがすべてのサブビューにイベントを送信しないようにします。
視覚的なフィードバックを提供するには、カスタム NSBox の -drawRect メソッドである種のオーバーレイを条件付きで描画するとうまくいきます。
はい、通常は 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);
}
}
}