我有一个自定义视图NSView
,我想禁用用户交互,但我不确定如何执行此操作。
我的想法是:
[myView setEnabled:NO];
但这是错误的并且不起作用。我怎样才能做到这一点,它只对用户可见,而没有别的?
我有一个自定义视图NSView
,我想禁用用户交互,但我不确定如何执行此操作。
我的想法是:
[myView setEnabled:NO];
但这是错误的并且不起作用。我怎样才能做到这一点,它只对用户可见,而没有别的?
NSView 没有 setEnabled: 或 setIgnoresMouseEvents:
实现返回的hitTest:
方法nil
。
子类化NSView
并添加以下方法
-(void)mouseDown:(NSEvent *)theEvent
{
}
从这里:
//
// NSView-DisableSubsAdditions.m
// Can Combine Icons
//
// Created by David Remahl on Tue Dec 25 2001.
// Copyright (c) 2001 Infinity-to-the-Power-of-Infinity. All rights reserved.
//
#import "NSView-DisableSubsAdditions.h"
@implementation NSView(DisableSubsAdditions)
- (void)disableSubViews
{
[self setSubViewsEnabled:NO];
}
- (void)enableSubViews
{
[self setSubViewsEnabled:YES];
}
- (void)setSubViewsEnabled:(BOOL)enabled
{
NSView* currentView = NULL;
NSEnumerator* viewEnumerator = [[self subviews] objectEnumerator];
while( currentView = [viewEnumerator nextObject] )
{
if( [currentView respondsToSelector:@selector(setEnabled:)] )
{
[(NSControl*)currentView setEnabled:enabled];
}
[currentView setSubViewsEnabled:enabled];
[currentView display];
}
}
@end
这是 Swift 4 中的一个示例。将您的视图放入此自定义视图中。
class UserInterectionDisabledView: NSView {
override func hitTest(_ point: NSPoint) -> NSView? {
return nil
}
}
我认为覆盖hitTest(_:)
并不理想,因为它可以阻止其背后的所有交互。
一个更好的方法是让视图拒绝becomeFirstResponder
。这样事件就可以发送到下一个响应者,基本上它会跳过视图。
class SubclassNSView: NSView {
public var isUserInteractionEnabled: Bool = true
open override func becomeFirstResponder() -> Bool {
if isUserInteractionEnabled == false {
return false
} else {
return super.becomeFirstResponder()
}
}
}