ane*_*yzm 10 macos events cocoa objective-c nscollectionview
我已将菜单绑定到界面构建器中的NSCollectionView.但是当我按住CTRL并单击(右键单击)时,菜单没有显示.
我试过在NSCollectionView子类中添加一些方法.它们都没有被调用:
+ (NSMenu*)defaultMenu
- (NSMenu *)menuForEvent:(NSEvent *)theEvent
- (void)rightMouseDown:(NSEvent *)theEvent
- (void)sendEvent:(NSEvent *)theEvent
Run Code Online (Sandbox Code Playgroud)
唯一被调用的方法是:
- (NSView *)hitTest:(NSPoint)aPoint
Run Code Online (Sandbox Code Playgroud)
这意味着NSCollectionView接收鼠标事件.
我也尝试将相同的方法添加到NSCollectionViewItem的子类中,结果是相同的.只有hitTest:被召唤.
我对“新”也有同样的问题NSCollectionView。上下文菜单是在 xib 中设置的,实际上可以通过实际右键单击鼠标以及触控板上的双指选项卡正确触发(如果用户已在系统偏好设置中设置该选项),但不能通过按住 Control 键单击。因此,这似乎是一个合法的错误或限制NSCollectionView,可能取决于它的设置方式。
无论如何,这里有一个更短的解决方案,这是 Swift 中的解决方案,假设您已经使用集合视图的出口设置了上下文菜单(或者您按照Apple 文档menu中的概述进行了设置)。
您需要创建 的子类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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我有用:
@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
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |