我正在使用以下绑定对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添加到阵列控制器,之前添加的子菜单消失,如下图所示:
在添加新项目之前:
添加新项目后:
我正在使用以下语句添加新的NSMenuItem:
[arrayController addObject:[[NSMenuItem alloc]initWithTitle:[newItemTextField stringValue] action:nil keyEquivalent:@""]];
我们对元素进行排序时会显示相同的行为。 关于解决这个问题的任何想法??
答案 0 :(得分:0)
如果不是添加forItem:[popUpButton itemAtIndex:[indexValue intValue]]
而是将其添加到arrayController中的项目,会发生什么?
我怀疑当你稍后在ArrayController中添加一个菜单项时,绑定会导致NSPopUpMenu本身从NSArrayController中的值创建新的NSMenuItems。并且数组控制器中的这些项目没有子菜单,因为您直接在PopUp按钮中创建了它。
就像在Array Controller中添加新项一样,我想你应该在子控制器中的项目中添加子菜单。
如果将子菜单添加到阵列控制器中的项目时,您没有看到按钮本身出现子菜单,则可能意味着您需要再次触发绑定,以便PopUp按钮重建其菜单。您可以通过将包含子菜单的代码包装到数组控制器来执行此操作:
[arrayController willChangeValueForKey:@"arrangedObjects"];
和
[arrayController didChangeValueForKey:@"arrangedObjects"];