我在 NSBox 中放置了几个控件(按钮、文本字段、...)。是否可以禁用用户无法访问控件的 NSBox(意味着无法单击按钮或在文本字段中写入)?
nsview 怎么样?
NSBox 基本上只是一个带边框的视图,没有办法“禁用”它。如果要禁用框中的所有控件,可以循环遍历其所有子视图并禁用它们,或者我这样做的另一种方法是在整个框上放置一个覆盖视图并覆盖该覆盖中的 mouseDown (以捕获任何 mouseDown 事件,因此它们不会在事件循环中排队)。您还可以将覆盖层设置为半透明的白色,以使框具有禁用的外观。
或者,如果你有一个自定义的 NSBox,你可以覆盖 NSView 的 -hitTest: (有条件地)
- (NSView *)hitTest:(NSPoint)aPoint {
if (!enabled) return nil;
else return [super hitTest:aPoint];
}
阻止窗口向所有子视图发送事件。
为了提供视觉反馈,有条件地在自定义 NSBox 的 -drawRect 方法中绘制某种叠加层会起作用。
是的,您只需要查看 NSBox 的子视图,它通常只是一个 NSView,然后您的实际控件将位于该子视图下。
这是我编写的一个快速 C 风格函数,用于启用/禁用最常见的 UI 控件,包括 NSBox...
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);
}
}
}