Как заставить NSToolBar проверки? - PullRequest
5 голосов
/ 17 декабря 2010

Я получаю это странное поведение.Я использую панель с текстом, чтобы показать пользователю, когда приложение ожидает некоторую информацию.Эта панель отображается модально, чтобы пользователь не мог щелкнуть что-либо.

Когда панель загрузки скрыта, все элементы на панели инструментов отключены, а метод validateToolbarItem не вызывается.

IПоказываю панель следующим образом:

- (void)showInWindow:(NSWindow *)mainWindow {
 sheetWindow = [self window];
 [self sheetWillShow];

 [NSApp beginSheet:sheetWindow modalForWindow:mainWindow modalDelegate:nil didEndSelector:nil contextInfo:nil];
 [NSApp runModalForWindow:sheetWindow];
 [NSApp endSheet:sheetWindow];
 [sheetWindow orderOut:self]; 
}

- (void)dismissModal {
 [sheetWindow close];
 [NSApp stopModal];
}

Как я могу заставить панель инструментов проверить в этом случае?

Редактировать после комментария:

Я уже пробовал:

  • [[[NSApp mainWindow] toolbar] validateVisibleItems]
  • [[NSApp mainWindow] update];
  • [NSApp updateWindows];
  • [NSApp setWindowsNeedUpdate:YES];

Все после звонка dismissModal.Я думаю, что проблема в другом месте ...

Ответы [ 2 ]

7 голосов
/ 04 марта 2013

Проблема в том, что 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, если полученное действие элемента обрабатывается контроллером в цепочке респондента.

Надеюсь, это поможет.

5 голосов
/ 17 декабря 2010
NSToolbar *toolbar; //Get this somewhere. If you have the window it is in, call [window toolbar];
[toolbar validateVisibleItems];
...