NSCollectionView没有弹出上下文菜单?

时间:2016-02-11 10:23:35

标签: objective-c macos cocoa events nscollectionview

我已将菜单限制在界面构建器中的NSCollectionView中。但是当我按住CTRL并单击(右键单击)时,菜单没有显示。

我尝试在NSCollectionView子类中添加一些方法。它们都没有被调用:

+ (NSMenu*)defaultMenu
- (NSMenu *)menuForEvent:(NSEvent *)theEvent
- (void)rightMouseDown:(NSEvent *)theEvent
- (void)sendEvent:(NSEvent *)theEvent

唯一被调用的方法是:

- (NSView *)hitTest:(NSPoint)aPoint

这意味着NSCollectionView会收到鼠标事件。

我还尝试将相同的方法添加到NSCollectionViewItem的子类中,结果是相同的。只调用hitTest:

3 个答案:

答案 0 :(得分:2)

我对“新” NSCollectionView有相同的问题。上下文菜单是在xib中设置的,实际上是由鼠标的实际右键单击以及触控板上的双指选项卡正确触发的(如果用户已在“系统偏好设置”中设置了该选项),但不能通过按住Control键单击来实现。因此,NSCollectionView似乎是合法的错误或局限性,可能取决于其设置方式。

无论如何,这是一个简短的解决方案,这是Swift中的一个解决方案,它假定您已经使用menu出口为集合视图设置了上下文菜单(或者您已经按照以下说明进行了设置) Apple's documentation

您将需要创建NSCollectionView的子类,并在xib中为集合视图选择子类。这是子类的代码:

import Cocoa

class MyCollectionView: NSCollectionView {

    /// Fixes the behavior of collection view with control-click, that does not properly trigger the contextual menu.
    override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)
        if event.type == .rightMouseDown || event.modifierFlags.contains(.control) {
            rightMouseDown(with: event)
        }
    }

}

答案 1 :(得分:1)

这对我有用:

@interface MyCollectionView : NSView
-(void)mouseDown:(NSEvent *)theEvent;
@end

@implementation MyCollectionView

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

    NSMenu *theMenu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"];
    [theMenu insertItemWithTitle:@"Beep" action:@selector(beep) keyEquivalent:@"" atIndex:0];
    [theMenu insertItemWithTitle:@"Honk" action:@selector(honk) keyEquivalent:@"" atIndex:1];

    [NSMenu popUpContextMenu:theMenu withEvent:theEvent forView:self];

    [super mouseDown:theEvent];

}

-(void)beep{

}

-(void)honk{

}

@end

我希望这会有所帮助。

答案 2 :(得分:0)

子类化NSCollectionView

class OSCollectionView: NSCollectionView {

    
    override func menu(for event: NSEvent) -> NSMenu? {
        print("menu() called")
        let menu = NSMenu()
        menu.addItem(NSMenuItem(title: "Create a clone", action: #selector(clone(_:)), keyEquivalent: ""))
        return menu
    }
    
    
    @objc
    func clone(_ sender: Any){
        //editDelegate?.terminateAndReplace(self)
        print("Clone item")
    }
}