如何从代码中禁用NSBox

时间:2012-05-05 14:38:20

标签: cocoa nsbox

我在NSBox中放了几个控件(按钮,文本字段......)。是否可以禁用用户无法访问控件的NSBox(意味着无法单击按钮或在文本字段中写入)?

nsview怎么样?

3 个答案:

答案 0 :(得分:5)

NSBox基本上只是一个带边框的视图,没有办法“禁用”它。如果你想要禁用一个框中的所有控件,你可以循环遍历它的所有子视图并禁用它们,或者我这样做的另一种方法是在整个框中放置一个叠加视图并覆盖该叠加中的mouseDown(捕获任何mouseDown事件,因此它们不会在事件循环中排队)。您还可以为叠加层提供半透明的白色,以使该框具有禁用的外观。

答案 1 :(得分:3)

或者,如果您有自定义NSBox,则可以覆盖NSView的-hitTest :(有条件地)

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

停止窗口向所有子视图发送事件。

要提供视觉反馈,有条件地在自定义NSBox的-drawRect方法中绘制某种叠加层将起作用。

答案 2 :(得分:1)

是的,您只需要查看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);
        }
    }
}