Проверка шрифтов и цветов NSToolbarItem элементов - PullRequest
4 голосов
/ 09 февраля 2011

Использование Cocoa с последним SDK на OSX 10.6.6

У меня есть NSToolbar с пользовательскими элементами панели инструментов, а также встроенные шрифты и цвета NSToolbarItem (идентификаторы NSToolbarShowFontsItem и NSToolbarShowColorsItem).

Мне нужно иметь возможность включать / отключать тех, кто в различных ситуациях. Проблема в том, что validateToolbarItem: никогда не вызывается для этих элементов (он вызывается для других моих элементов панели инструментов).

В документации не очень ясно об этом:

Панель инструментов автоматически позаботится затемнения элемента изображения, когда он щелкнул и исчезает, когда это отключен. Все, что ваш код должен сделать, это проверить товар. Если элемент изображения имеет правильную пару цель / действие, затем панель инструментов будет вызывать NSToolbarItemValidation-х validateToolbarItem: на цели, если цель реализует это; в противном случае пункт включен по умолчанию.

Я не устанавливаю явно цель / действие для этих двух элементов панели инструментов, я хочу использовать их поведение по умолчанию. Означает ли это, что я не могу подтвердить эти пункты? Или есть другой способ сделать это?

Спасибо.

1 Ответ

1 голос
/ 11 февраля 2011

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

Это еще один из недостатков дизайна Какао. NSToolbar имеет жестко запрограммированное поведение для установки цели / действия для NSToolbarShowFontsItem и NSToolbarShowColorsItem в NSApplication, так что в документации указывается, что он никогда не вызовет validateToolbarItem: для этих элементов NSToolbarItem.

Если вам нужно проверить эти элементы панели инструментов, тривиальная задача состоит не в том, чтобы использовать элементы панели шрифтов / цветов по умолчанию, а в том, чтобы прокрутить свои собственные, вызывая те же действия NSApplication (см. Ниже).

При использовании значений по умолчанию можно перенаправить цель / действие из них на ваш объект, а затем вызвать исходные действия

- (void) toolbarWillAddItem:(NSNotification *)notification {
  NSToolbarItem *addedItem = [[notification userInfo] objectForKey: @"item"];
  if([[addedItem itemIdentifier] isEqual: NSToolbarShowFontsItemIdentifier]) {                
    [addedItem setTarget:self];
    [addedItem setAction:@selector(toolbarOpenFontPanel:)];
  } else if ([[addedItem itemIdentifier] isEqual: NSToolbarShowColorsItemIdentifier]) {
    [addedItem setTarget:self];
    [addedItem setAction:@selector(toolbarOpenColorPanel:)];
  }
} 

Теперь validateToolbarItem: будет называться:

- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
  //validate item here
}

А вот действия, которые будут вызваны:

-(IBAction)toolbarOpenFontPanel:(id)sender {
  [NSApp orderFrontFontPanel:sender];
}

-(IBAction)toolbarOpenColorPanel:(id)sender {
  [NSApp orderFrontColorPanel:sender];
}

Я думаю, что инженеры, которые разработали это, никогда не думали, что они захотят проверить элементы панели инструментов шрифтов / цветов. Пойди разберись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...