2015-12-21 2 views
0

У меня есть 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:.

Я все еще мог удалить меню, сравнив название, но это похоже на плохой способ сделать это и, вероятно, сломается в локализованной среде.

Любые предложения относительно того, чтобы PROPERLY обходить пункты меню из контекстного меню NSTextView? (Удаление по индексу также кажется взломанным, поскольку это может привести к разрыву на разных версиях ОС).

ответ

1

В каждом подменю menuitem есть меню. Сканирование подменю для действия changeLayoutOrientation:.

Вы можете отключить элементы меню ориентации макета, реализовав validateUserInterfaceItem:.

- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)anItem { 
    if ([anItem action] == @selector(changeLayoutOrientation:)) 
     return NO; 
    return [super validateUserInterfaceItem:anItem]; 
} 
Смежные вопросы