从 NSTextView 上下文菜单中删除 'Layout Orientation'

Remove 'Layout Orientation' from NSTextView context menu

我有一个 NSTextView,它附有一个显示行号的标尺。如果用户使用 'Layout Orientation' -> 'Vertical' 上下文菜单,事情就会变得不稳定。应用程序的预期目的无论如何都不支持垂直方向,所以我想删除这个上下文菜单。

到目前为止,我已经将 NSTextView 子类化并覆盖了 defaultMenu 操作:

+ (NSMenu *) defaultMenu
{
    // Get our default menu
    NSMenu * contextMenu =
        [NSTextView defaultMenu];

    for(NSInteger menuItemIndex = contextMenu.itemArray.count - 1;
        menuItemIndex != -1;
        --menuItemIndex)
    {
        NSMenuItem * menuItem =
            [contextMenu itemAtIndex: menuItemIndex];

        NSLog(@"%ld %@, %@",
              menuItemIndex,
              NSStringFromSelector(menuItem.action),
              menuItem.title);
    } // End of menuItem loop

    return contextMenu;
} // End of defaultMenu

我最初的想法是我可以删除带有特定选择器的菜单项,但不幸的是 'Layout Orientation' 是一个子菜单,所以它有 submenuAction: 选择器。

我仍然可以通过比较标题来删除菜单,但这似乎是一种糟糕的方法,并且可能会在本地化环境中中断。

关于从 NSTextView 上下文菜单中正确删除菜单项的任何建议? (按索引删除也似乎很老套,因为这可能会在 OS 的不同版本上中断)。

每个子菜单菜单项都有一个菜单。扫描子菜单以执行操作 changeLayoutOrientation:.

您可以通过实施 validateUserInterfaceItem: 来禁用布局方向菜单项。

- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)anItem {
    if ([anItem action] == @selector(changeLayoutOrientation:))
        return NO;
    return [super validateUserInterfaceItem:anItem];
}