我有一个配置了绑定和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)我只想要“编辑列表...”菜单项来启动操作,如何防止将其选为值?
答案 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 ...”,而不是另一个“有效”项,非常不方便。