Как отключить взаимодействие с пользователем в пользовательском представлении

У меня есть пользовательский вид NSView, и я хочу отключить взаимодействие с пользователем, но не знаю, как это сделать.

Моя идея была:

[myView setEnabled:NO];

но это неправильно и не работает. Как я могу сделать так, чтобы он был виден только пользователю и ничего больше?


person Viper OS X    schedule 31.07.2012    source источник
comment
попробуйте [myView setUserInteractionEnabled: NO];   -  person Tuna Karakasoglu    schedule 31.07.2012
comment
@CodersParadise: этот вопрос касается OS X, а не iOS. В NSView нет такого свойства или метода...   -  person NSGod    schedule 09.04.2013


Ответы (4)


NSView не имеет ни setEnabled:, ни setIgnoresMouseEvents:

Реализовать метод hitTest: для возврата nil.

person Ravindhiran    schedule 08.11.2013
comment
Мне нравится это решение. Прост в реализации и более надежен и надежен, чем отключение подвидов, если они являются элементами управления. - person DarkDust; 18.02.2015
comment
Это не сработало для меня вообще. В моем случае реализация mouseDown: ничего не делает. - person ghr; 31.05.2017
comment
Это предотвратило бы взаимодействие с мышью, но мы хотели бы отключить любое взаимодействие, в том числе через клавиатуру (что возможно, включив навигацию с клавиатуры с помощью Ctrl-F7, а затем используя клавиши Tab и пробел) - person Thomas Tempelmann; 26.05.2019

Из здесь:

//
//  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
person trojanfoe    schedule 31.07.2012
comment
Код, защищенный авторским правом, вставлен при переполнении стека? Серьезно!? - person wcochran; 20.03.2018
comment
@wcochran Это действительно разрешено. См. здесь: meta.stackoverflow.com/a/319061/2228559 - person aleclarson; 17.02.2019
comment
Вот еще одна библиотека, похожая на этот ответ: github.com/ardalahmet/DisableSubviews - person aleclarson; 17.02.2019

подкласс NSView и добавьте следующий метод

-(void)mouseDown:(NSEvent *)theEvent
{

}
person Muruganandham K    schedule 12.02.2014
comment
Идеальный. hitTest: возврат nil у меня вообще не работает - похоже, это предотвратило вызов mouseDown. Так что просто используйте пустой mouseDown: - person ghr; 31.05.2017
comment
Это предотвратило бы взаимодействие с мышью, но мы хотели бы отключить любое взаимодействие, в том числе через клавиатуру (что возможно, включив навигацию с клавиатуры с помощью Ctrl-F7, а затем используя клавиши Tab и пробел) - person Thomas Tempelmann; 26.05.2019

Вот пример в Swift 4. Поместите свои представления в это пользовательское представление.

class UserInterectionDisabledView: NSView {
    override func hitTest(_ point: NSPoint) -> NSView? {
        return nil
    }
}
person Joey    schedule 14.03.2019
comment
Это может помешать взаимодействию с мышью, но мы хотели бы отключить любое взаимодействие, в том числе через клавиатуру. - person Thomas Tempelmann; 26.05.2019