维护NSPopUpButton中的子菜单

时间:2012-06-23 09:19:28

标签: objective-c cocoa

我正在使用以下绑定对NSPopUpButton进行排序:

[arrayController bind:@"contentArray" toObject:self withKeyPath:@"displayElements" options:nil];
[popUpButton bind:@"content" toObject:arrayController withKeyPath:@"arrangedObjects" options:nil];
[popUpButton bind:@"contentValues" toObject:arrayController withKeyPath:@"arrangedObjects.title" options:nil];

displayElements 是NSMenuItem的NSMutable数组

displayElements = [[NSMutableArray alloc] initWithObjects:[[NSMenuItem alloc]initWithTitle:@"one" action:nil keyEquivalent:@""],
                                                              [[NSMenuItem alloc]initWithTitle:@"two" action:nil keyEquivalent:@""],
                                                              [[NSMenuItem alloc]initWithTitle:@"three" action:nil keyEquivalent:@""],
                                                              nil];

并且排序工作正常。

现在的问题是,如果我在任何菜单项中添加子菜单,之后我将新的NSMenuItem添加到阵列控制器,之前添加的子菜单消失,如下图所示:

在添加新项目之前:

enter image description here

添加新项目后:

enter image description here

我正在使用以下语句添加新的NSMenuItem:

[arrayController addObject:[[NSMenuItem alloc]initWithTitle:[newItemTextField stringValue] action:nil keyEquivalent:@""]];

我们对元素进行排序时会显示相同的行为。 关于解决这个问题的任何想法??

1 个答案:

答案 0 :(得分:0)

如果不是添加forItem:[popUpButton itemAtIndex:[indexValue intValue]]而是将其添加到arrayController中的项目,会发生什么?

我怀疑当你稍后在ArrayController中添加一个菜单项时,绑定会导致NSPopUpMenu本身从NSArrayController中的值创建新的NSMenuItems。并且数组控制器中的这些项目没有子菜单,因为您直接在PopUp按钮中创建了它。

就像在Array Controller中添加新项一样,我想你应该在子控制器中的项目中添加子菜单。

如果将子菜单添加到阵列控制器中的项目时,您没有看到按钮本身出现子菜单,则可能意味着您需要再次触发绑定,以便PopUp按钮重建其菜单。您可以通过将包含子菜单的代码包装到数组控制器来执行此操作: [arrayController willChangeValueForKey:@"arrangedObjects"];[arrayController didChangeValueForKey:@"arrangedObjects"];