[英]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.