複数のコントロール(ボタン、テキストフィールドなど)をNSBoxに配置しました。ユーザーがコントロールにアクセスできないNSBoxを無効にすることは可能ですか(ボタンをクリックしたり、テキストフィールドに書き込むことはできません)コードからNSBoxを無効にする方法
どのようにnsviewについてですか?
複数のコントロール(ボタン、テキストフィールドなど)をNSBoxに配置しました。ユーザーがコントロールにアクセスできないNSBoxを無効にすることは可能ですか(ボタンをクリックしたり、テキストフィールドに書き込むことはできません)コードからNSBoxを無効にする方法
どのようにnsviewについてですか?
または、カスタムNSBoxを持っている場合は、NSViewのの-hitTest上書きすることができます:すべてのサブビューにイベントを送信からウィンドウを停止するには(条件付き)
- (NSView *)hitTest:(NSPoint)aPoint {
if (!enabled) return nil;
else return [super hitTest:aPoint];
}
を。
視覚的なフィードバックを提供するために、カスタムNSBoxの-drawRectメソッドで何らかのオーバーレイを条件付きで描画すると機能します。
NSBoxは、基本的に境界線を持つビューですが、それを「無効にする」方法はありません。ボックス内のすべてのコントロールを無効にしたい場合は、すべてのサブビューをループして無効にするか、これを行った別の方法は、オーバーレイビューをボックス全体に配置し、そのオーバーレイ内のmouseDownをオーバーライドする任意のmouseDownイベントはイベントループでキューに入れられません)。また、オーバーレイに半透明の白色を付けることで、ボックスの外観が無効になるようにすることもできます。
素晴らしいアイデアを有効/ NSBoxを含む最も一般的なUIコントロールを、無効に書いた迅速なC形式の関数です。ありがとう。 –
はい、通常は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);
}
}
}
これはユーザーに視覚的なフィードバックを提供しませんか?私はそれが混乱するかもしれないと思う(あなたが警告や何かを投げていない限り)。 – rdelmar
いいえ、視覚的なフィードバックはありません(カスタム図面を使用しない限り)ので、ほとんどの使用例ではおそらく答えが良いでしょう。 – Vervious