Приложение на основе NSDocument и NSToolbar

У меня есть приложение на основе NSDocument (NSPersistentDocument), в приложении я могу создать (как обычно) более одного документа.

В главном окне документа (на основе NSPersistentDocument) добавлена ​​панель инструментов IB. В коде я добавляю элемент на панель инструментов (NSToolbarItems) с помощью методов insertItemWithItemIdentifier и - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag.

Примеры кода:

[_toolbar insertItemWithItemIdentifier:@"addTape" atIndex:2];

и

- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag {
    NSToolbarItem *item =nil;

    if ([itemIdentifier isEqual:@"addTape"]) {
        item = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier];
        item.label = NSLocalizedString(@"Add Tape",@"Add Tape");
        item.paletteLabel = NSLocalizedString(@"Add Tape",@"Add Tape");
        item.toolTip = NSLocalizedString(@"Adds new tape",@"Adds new tape");
        item.image = [NSImage imageNamed:@"NSAddTemplate"];
        item.target = self;
        item.action = @selector(addTape:);
        item.tag = 101;         
    }
}

Все правильно, пока я не открыл только один документ. Когда я открываю второй документ (или создаю новый документ) в окне первого документа, элементы панели инструментов удваиваются (после открытия третьего документа элементы утраиваются в первом окне и удваиваются во втором и т. Д.).

Изменить: я заметил, что itemForItemIdentifier вызывается в каждом окне каждый раз, когда я пытаюсь добавить элемент на панель инструментов. В примере: если у меня есть два окна (два открытых документа) и в одно я пытаюсь добавить одну кнопку, itemForItemIdentifier вызывается два раза.
Это странно для меня, потому что каждый документ имеет собственную панель инструментов с делегатом, установленным только для этого документ.

Я понятия не имею, что сделал не так. Может кто укажет мне, где я ошибся.


person Tomasz Wojtkowiak    schedule 22.07.2012    source источник


Ответы (2)


Обычно вы сами не вставляете элементы панели инструментов; реализуйте методы делегата toolbarAllowedItemIdentifiers: и toolbarDefaultItemIdentifiers:, и панель инструментов будет инициализирована в соответствии с этими списками.

person Kevin Grant    schedule 23.07.2012
comment
Спасибо за ответ, но для меня это не вариант, я должен управлять элементами панели инструментов. Но я нашел решение. - person Tomasz Wojtkowiak; 23.07.2012
comment
В итоге я использовал вышеуказанное решение. Я разрешаю плагинам добавлять элементы на панель инструментов. Чтобы позволить это, я сохранил синглтон, который запомнил добавленные мной nstoolbaritems (и которые были возвращаемым значением для методов делегата), поэтому insertItemWithItemIdentifier вызывается только один раз для каждого нового элемента панели инструментов, а методы делегата в каждом документе возвращают то же самое. список идентификаторов. Кажется, что метод делегата toolbar: itemForItemIdentifier приводит к тому, что копия элемента добавляется на панель инструментов, поэтому вы можете установить действие и цель для правильного документа здесь, и он не будет переопределять другие - person James Alvarez; 23.11.2014

Я нашел решение: я не могу использовать tooolbar, созданный из пера, потому что каждая созданная панель инструментов этого метода имеет тот же идентификатор. Когда я создал панели инструментов в коде, используя разные идентификаторы, проблема исчезла.

person Tomasz Wojtkowiak    schedule 23.07.2012