17

カスタム ビューがNSViewあり、ユーザー インタラクションを無効にしたいのですが、その方法がわかりません。

私の考えは:

[myView setEnabled:NO];

しかし、それは間違っていて機能しません。ユーザーにのみ表示され、他には何も表示されないようにするにはどうすればよいですか?

4

5 に答える 5

12

NSView には setEnabled: も setIgnoresMouseEvents: もありません。

を返すメソッドを実装hitTest:nilます。

于 2013-11-08T14:39:43.180 に答える
3

ここから:

//
//  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
于 2012-07-31T13:07:22.533 に答える
0

hitTest(_:)オーバーライドは、その背後にあるすべての相互作用をブロックする可能性があるため、理想的ではないと思います。

より良い方法は、ビューを拒否することbecomeFirstResponderです。イベントを次のレスポンダーに送信できるように、基本的にはビューをスキップします。

class SubclassNSView: NSView {

  public var isUserInteractionEnabled: Bool = true

  open override func becomeFirstResponder() -> Bool {
    if isUserInteractionEnabled == false {
      return false
    } else {
      return super.becomeFirstResponder()
    }
  }
}
于 2021-10-28T08:20:31.807 に答える