Apple's sample code和阅读the docs中,我看不到将NSPathControl配置为与例如类似的行为。 Xcode编辑器窗口中的“跳转栏”:

IE。是否具有表示路径(或其他类型的层次结构)的路径,并使该路径的每个组件成为可单击的弹出窗口以浏览层次结构。

有人通过使用NSPathControlDelegate监听点击并在临时窗口中显示菜单来伪造这种行为吗?

似乎是一种常见的设计,甚至可以期望某些OSS实现-但是还没有运气。

最佳答案

我制作了NSPathControl的子类,以便可以使用mouseDown:在正确位置弹出组件单元的上下文菜单。我还在菜单中添加了一个委托(delegate),以根据需要创建更深的菜单。

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

    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];


    NSPathCell *cell = self.cell;
    NSPathComponentCell *componentCell = [cell pathComponentCellAtPoint:point
                                                              withFrame:self.bounds
                                                                 inView:self];

    NSRect componentRect = [cell rectOfPathComponentCell:componentCell
                                               withFrame:self.bounds
                                                  inView:self];

    NSMenu *menu = [componentCell menuForEvent:event
                                        inRect:componentRect
                                        ofView:self];

    if (menu.numberOfItems > 0) {
        NSUInteger selectedMenuItemIndex = 0;
        for (NSUInteger menuItemIndex = 0; menuItemIndex < menu.numberOfItems; menuItemIndex++) {
            if ([[menu itemAtIndex:menuItemIndex] state] == NSOnState) {
                selectedMenuItemIndex = menuItemIndex;
                break;
            }
        }

        NSMenuItem *selectedMenuItem = [menu itemAtIndex:selectedMenuItemIndex];
        [menu popUpMenuPositioningItem:selectedMenuItem
                            atLocation:NSMakePoint(NSMinX(componentRect) - 17, NSMinY(componentRect) + 2)
                                inView:self];
    }
}

- (NSMenu *)menuForEvent:(NSEvent *)event {
    if (event.type != NSLeftMouseDown) {
        return nil;
    }
    return [super menuForEvent:event];
}

关于objective-c - NSPathControl带有路径的每个组件的弹出窗口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12708715/

10-12 01:39