簡體   English   中英

如何從代碼禁用NSBox

[英]How to disable NSBox from code

我在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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM