0

我正在使用以下绑定对 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:@""]];

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

4

1 回答 1

0

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

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

就像您在 Array Controller 中添加新项目一样,我想您应该为 Array Controller 中的项目添加子菜单。

如果当您将子菜单添加到数组控制器中的项目时,您没有看到子菜单出现在按钮本身中,这可能意味着您需要再次触发绑定,以便弹出按钮将重建其菜单。您可以通过包装将子菜单添加到数组控制器的代码来做到这一点: [arrayController willChangeValueForKey:@"arrangedObjects"];[arrayController didChangeValueForKey:@"arrangedObjects"];

于 2012-06-25T11:24:41.757 回答