从NSTextView上下文菜单中删除“布局方向”

时间:2015-12-21 15:04:06

标签: macos cocoa nstextview

我有一张NSTextView,附有标尺,显示行号。如果用户使用“布局方向” - > '垂直'上下文菜单,事情变得不稳定。应用程序的目的不支持垂直方向,所以我想删除此上下文菜单。

到目前为止,我已经将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

我最初的想法是我可以使用特定的选择器删除菜单项,但不幸的是“布局方向”是一个子菜单,因此它有submenuAction:选择器。

我仍然可以通过比较标题来删除菜单,但这似乎是一种不好的方法,可能会在局部环境中破坏。

有关从NSTextView上下文菜单中删除菜单项的正确建议吗? (通过索引删除也似乎很麻烦,因为这可能会破坏不同版本的操作系统)。

1 个答案:

答案 0 :(得分:1)

每个子菜单menuitem都有一个菜单。扫描子菜单以查看操作changeLayoutOrientation:

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

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