Как настроить контент для NSPopUpButton

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

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

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

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

- (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) Я просто хочу, чтобы пункт меню "Редактировать список..." инициировал действие, как мне предотвратить его выбор в качестве значения?


person Cory    schedule 31.01.2014    source источник
comment
[NSMenu addItem:] добавляет элемент в конец списка.   -  person Andriy    schedule 31.01.2014
comment
@Andriy попробовал это, но элемент по-прежнему находится вверху списка.   -  person Cory    schedule 31.01.2014
comment
С Bindings он всегда будет наверху.   -  person Volker    schedule 01.02.2014


Ответы (1)


Вы также можете сделать это с помощью метода NSMenuDelegate.

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

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

2) Реализуйте метод menuNeedsUpdate NSMenuDelegate: туда вы добавите NSmenuItem (ы) (и, в конечном итоге, разделители), которые вы хотите предоставить в дополнение к тем, которые уже получены привязками 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 будет выбран новый элемент «Редактировать…», а не другой «действительный», что очень неудобно. .

person valeCocoa    schedule 06.11.2016