Проблема в том, что NSToolbar отправляет только сообщения проверки в NSToolbarItem, которые имеют тип изображения, которого не было ни у одного из меня. Чтобы проверить любой или все NSToolbarItems, создайте пользовательский подкласс NSToolBar и переопределите validateVisibleItems: метод. Это отправит проверочные сообщения ВСЕМ видимым NSToolbarItem's. Единственное реальное отличие состоит в том, что вместо того, чтобы класс панели инструментов включал или отключал элемент с помощью возвращенного BOOL, вам нужно включить или отключить элемент в самом методе проверки.
@interface CustomToolbar : NSToolbar
@end
@implementation CustomToolbar
-(void)validateVisibleItems
{
for (NSToolbarItem *toolbarItem in self.visibleItems)
{
NSResponder *responder = toolbarItem.view;
while ((responder = [responder nextResponder]))
{
if ([responder respondsToSelector:toolbarItem.action])
{
[responder performSelector:@selector(validateToolbarItem:) withObject:toolbarItem];
}
}
}
}
@end
Теперь предположим, что у вас есть контроллер с методом IBAction, который обрабатывает действия для NSSegmentedControl на панели инструментов:
- (IBAction)backButton:(NSSegmentedControl*)sender
{
NSInteger segment = sender.selectedSegment;
if (segment == 0)
{
// Action for first button segment
}
else if (segment == 1)
{
// Action for second button segment
}
}
Поместите следующее в тот же контроллер, который обрабатывает действие элемента панели инструментов:
-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
{
SEL theAction = [toolbarItem action];
if (theAction == @selector(backButton:))
{
[toolbarItem setEnabled:YES];
NSSegmentedControl *backToolbarButton = (NSSegmentedControl *)toolbarItem.view;
[backToolbarButton setEnabled:YES forSegment:0];
[backToolbarButton setEnabled:NO forSegment:1];
}
return NO;
}
В результате вы получаете полный контроль над тем, какие сегменты включены или отключены.
Этот метод должен применяться практически к любому другому типу NSToolbarItem, если полученное действие элемента обрабатывается контроллером в цепочке респондента.
Надеюсь, это поможет.