2014-01-31 1 views
0

У меня есть NSPopUpButton, настроенный с привязками и coredata. Все работает отлично, но я хотел бы добавить элемент, который реализует действие, «редактировать список», какКак настроить контент для NSPopUpButton

Item 1 
Item 2 
Item 3 
Item 4 
------ 
Edit List.. 

Возможно ли это сделать с креплениями?

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

- (void)updateSectorPopupItems 
{ 
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Sector"]; 
    NSSortDescriptor *sortPosition = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES]; 

    [request setSortDescriptors:@[sortPosition]]; 

    NSError *anyError = nil; 
    NSArray *fetchObjects = [_gdcManagedObjectContext executeFetchRequest:request 
                    error:&anyError]; 
    if (fetchObjects == nil) { 
     DLog(@"Error:%@", [anyError localizedDescription]); 
    } 

    NSMutableArray *sectorNames = [NSMutableArray array]; 
    for (NSManagedObject *sector in fetchObjects) { 
     [sectorNames addObject:[sector valueForKey:@"sectorCatagory"]]; 
    } 

    [_sectorPopUpBotton addItemsWithTitles:sectorNames]; 
    NSInteger items = [[_sectorPopUpBotton menu] numberOfItems]; 

    if (![[_sectorPopUpBotton menu] itemWithTag:1]) { 
     NSMenuItem *editList = [[NSMenuItem alloc] initWithTitle:@"Edit List..." action:@selector(showSectorWindow:) keyEquivalent:@""]; 
     [editList setTarget:self]; 
     [editList setTag:1]; 
     [[_sectorPopUpBotton menu] insertItem:editList atIndex:items]; 
} 

Несколько проблем, которые я имею с этим

1) при добавлении пункта меню не используя

[_sectorPopUpBotton menu] insertItem:editList atIndex:items]; 

независимо от того, какое значение вводится в atIndex, элемент всегда появляется в верхней части списка меню.

2) Я просто хочу, чтобы меню «Редактировать список ...» инициировал действие, как я могу предотвратить его выбор в качестве значения?

+0

'[NSMenu addItem:]' добавляет элемент в конец списка. – Andriy

+0

@ Andriy попробовал это, но элемент все еще находится в верхней части списка. – Cory

+1

С привязками он всегда будет наверху. – Volker

ответ

0

Вы также можете сделать это с использованием метода NSMenuDelegate.

На самом деле вы также можете сохранить привязки для получения объектов контента NSPopUpButton (в вашем случае из NSArrayController привязаны к стеку CoreData).

1) Установите объект в качестве делегата для внутреннего меню NSPopUpButton, вы можете сделать это в построителе интерфейса, сверлив NSPopUpButton, чтобы открыть его внутреннее меню. Выберите его, а затем установите его делегат на панели «Инспекторы подключений» к объекту, который вы назначили для этой задачи. В качестве такого делегата вы можете, например, предоставить тот же объект ViewController, который управляет представлением, где существует NSPopUpButton. Затем вам необходимо предоставить объект, предоставленный в качестве делегата, в соответствии с неофициальным протоколом NSMenuDelegate.

2) Внесите NSMenuDelegate метод menuNeedsUpdate: там вы добавите NSmenuItem (s) (и в конечном итоге разделители), которые вы хотите предоставить, в дополнение к тем, которые уже были привязаны связями NSPopButton. Пример кода будет:

#pragma mark NSMenuDelegate 
- (void)menuNeedsUpdate:(NSMenu *)menu { 
    if ([_thePopUpButton menu] == menu && ![[menu itemArray] containsObject:_editMenuItem]) { 
     [menu addItem:[NSMenuItem separatorItem]]; 
     [menu addItem:_editMenuItem]; 
    } 
} 

В этом примере _editMenuItem является свойством NSMenuItem при условии, объектом реализации этого метода NSMenuDelegate. В конце концов, это может быть что-то, как это:

_editMenuItem = [[NSMenuItem alloc] initWithTitle:@"Edit…" action:@selector(openEditPopUpMenuVC:) keyEquivalent:@""]; 
// Eventually also set the target for the action: where the selector is implemented. 
_editMenuItem.target = self; 

Вы затем реализовать метод openEditPopUpMenuVC: представить к пользователю зрения ответственности за редактирование содержимого PopUpButton (в вашем случае объектов CoreData, предоставляемые с помощью привязок) ,

Единственная проблема, с которой я еще не решил этот подход, заключается в том, что при возврате из представления, где происходит изменение, в NSPopUpButton будет выбран новый элемент «Изменить ...», а не другой «действительный», что очень неудобно.