我有一个需要在 NSPopUpButton 中显示的元素列表。我希望 PopUp 按钮按字母顺序显示列表。此外,列表中还有一个新的 MenuItem,它会从文本字段中选取一个字符串并将其插入到 PopUp 按钮中。所以,我想问两个问题:
- 在 NSPopUpButton 中按排序顺序显示元素列表的正确方法是什么?
- 我应该如何处理向 NSPopUpButton 插入新元素以保持排序顺序?
最佳答案
如果您使用 NSArrayController
来填充弹出按钮(或者更确切地说,它的菜单),那么您可以只定义一个排序描述符来处理排序。
第一次让数组 Controller 与弹出按钮一起工作可能有点棘手,但是如果您将弹出按钮的 contents 绑定(bind)到数组 Controller 的 arrangedObjects
并且然后将内容值绑定(bind)到模型对象的合适的字符串属性,应该没问题。
然后,添加一个新项目将只是通过数组 Controller 添加一个项目的问题。
因此,如果您不熟悉 NSArrayController
类和绑定(bind),以下是您如何在 Interface Builder 中执行此操作的简短说明。假设您的元素有一个名为 name
的字符串属性。
- 在您的 nib 文件的所有者(例如应用委托(delegate))中创建一个(可变的)数组属性来保存您的元素。
- 在 Interface Builder 中创建数组 Controller 对象。
- 将其内容数组绑定(bind)到您刚刚创建的数组属性。可以在 Xcode 的绑定(bind)检查器 (Cmd-Opt-7) 中设置绑定(bind)。
- 向窗口添加一个弹出按钮。
- 将弹出按钮的内容绑定(bind)到数组 Controller 的
arrangedObjects
Controller 键。这是该绑定(bind)的默认选项。 - 将弹出按钮的内容值绑定(bind)到数组 Controller 的
arrangedObjects
Controller 键和name
模型键路径。这将在菜单中提供正确的文本。 - 在您的代码中的某处,创建一个排序描述符并将其设置在数组 Controller 上(使用
setSortDescriptors:
方法)。为此,您可能需要在文件所有者上定义一个导出来容纳阵列 Controller 。 - 要向弹出按钮添加新元素,请使用数组 Controller 的
add:
方法。
这应该让您使用最少的自己的代码和一点 Interface Builder 的魔力。
对于相当简单的 UI 元素,绑定(bind)确实可以节省大量工作。关于他们的更多信息 here .
编辑以添加示例:
有关如何完成此操作的示例,请考虑一个具有应用程序委托(delegate)的应用程序,该应用程序委托(delegate)具有 data
属性、字典数组和 name
属性。请注意,这是比您的示例更深的抽象级别,其中数组仅包含单个字符串。就个人而言,我更喜欢这种方式。
self.data = [NSMutableArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:@"Flowers", @"name", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Animals", @"name", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Trees", @"name", nil],
nil];
// Sort the array controller alphabetically by the name property
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
self.arrayController.sortDescriptors = [NSArray arrayWithObject:sd];
关于objective-c - 对 NSPopUpButton 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11098205/