- (void)rightMouseDown:(NSEvent *)event
Ein NSView gibt dies nicht an die nächste Ansicht weiter. Diese Methode überprüft, ob die aktuelle Klasse ein menuForEvent: hat, wenn dies der Fall ist, wird es aufgerufen. Wenn nicht, ist der Vorgang abgeschlossen und es passiert nichts mehr. Deshalb wird ein NSTableCellView nicht auf ein menuForEvent: reagieren, weil die Tabelle das rightMouseDown: absorbiert.
Sie können die TableView-Subklasse erstellen und das rightMouseDown: Ereignis behandeln und das rightMouseDown: von NSTableCellView aufrufen und Ihr Menü anzeigen, das Sie in Ihrem Storyboard erstellt und mit Ihrer NSTableViewCell verbunden haben.
Hier ist meine Lösung in einer untergeordneten NSTableView:
- (void)rightMouseDown:(NSEvent *)event
{
for (NSTableRowView *rowView in self.subviews) {
for (NSView *tableCellView in [rowView subviews]) {
if (tableCellView) {
NSPoint eventPoint = [event locationInWindow];
// NSLog(@"Fensterpunkt: %@", NSStringFromPoint(eventPoint));
eventPoint = [self convertPoint:eventPoint toView:nil];
eventPoint = [self convertPoint:eventPoint toView:self];
// NSLog(@"Tabellenansichtspunkt: %@", NSStringFromPoint(eventPoint));
NSRect newRect = [tableCellView convertRect:[tableCellView bounds] toView:self];
// NSLog(@"Rechteck: %@", NSStringFromRect(newRect));
BOOL rightMouseDownInTableCellView = [tableCellView mouse:eventPoint inRect:newRect];
// NSLog(@"Maus in Ansicht: %hhd", mouseInView);
if (rightMouseDownInTableCellView) {
if (tableCellView) {
// Seien wir sicher und stellen Sie sicher, dass das Objekt darauf reagieren wird.
if ([tableCellView respondsToSelector:@selector(rightMouseDown:)]) {
[tableCellView rightMouseDown:event];
}
}
}
}
}
}
}
Dadurch wird festgestellt, wo das Rechtsklickevent aufgetreten ist, überprüft, ob die richtige Ansicht vorhanden ist, und leitet das rightMouseDown: an diese Ansicht weiter.
Bitte lassen Sie mich wissen, ob diese Lösung für Sie funktioniert.