如何为NSPopUpButton配置内容

时间:2014-01-31 19:08:28

标签: cocoa core-data cocoa-bindings nspopupbutton

我有一个配置了绑定和coredata的NSPopUpButton。一切都很完美,但是我想添加一个实现“编辑列表”操作的项目,比如

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

这可能与Bindings有关吗?

我认为答案是否定的,至少不是完全的。我以为我会以编程方式为按钮提供内容并保持选定值的绑定,所以这就是我想出来的

- (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)我只想要“编辑列表...”菜单项来启动操作,如何防止将其选为值?

1 个答案:

答案 0 :(得分:0)

你可以使用NSMenuDelegate方法做到这一点。

实际上,通过这种方式,您还可以保留绑定以获取NSPopUpButton内容对象(在您的情况下,从绑定到CoreData堆栈的NSArrayController)。

1)将对象设置为NSPopUpButton内部菜单的委托,您可以通过向下钻取NSPopUpButton以显示其内部菜单,在Interface Builder中执行此操作。选择它,然后在Connections Inspector面板中将其委托设置为您为此任务指定的对象。作为这样的委托,您可以提供相同的ViewController对象来管理NSPopUpButton所在的视图。 然后,您需要将作为委托提供的对象遵守NSMenuDelegate非正式协议。

2)实现NSMenuDelegate方法menuNeedsUpdate:除了已经由NSPopButton的绑定提取的NSmenuItem之外,你还要添加你想要提供的NSmenuItem(以及最终的分隔符)。 示例代码为:

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

在此示例中,_editMenuItem是由实现此NSMenuDelegate方法的对象提供的NSMenuItem属性。最终它可能是这样的:

_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将选择新项“Edit ...”,而不是另一个“有效”项,非常不方便。