objective-c - 对 NSPopUpButton 进行排序

标签 objective-c cocoa

我有一个需要在 NSPopUpButton 中显示的元素列表。我希望 PopUp 按钮按字母顺序显示列表。此外,列表中还有一个新的 MenuItem,它会从文本字段中选取一个字符串并将其插入到 PopUp 按钮中。所以,我想问两个问题:

  1. 在 NSPopUpButton 中按排序顺序显示元素列表的正确方法是什么?
  2. 我应该如何处理向 NSPopUpButton 插入新元素以保持排序顺序?

最佳答案

如果您使用 NSArrayController 来填充弹出按钮(或者更确切地说,它的菜单),那么您可以只定义一个排序描述符来处理排序。

第一次让数组 Controller 与弹出按钮一起工作可能有点棘手,但是如果您将弹出按钮的 contents 绑定(bind)到数组 Controller 的 arrangedObjects 并且然后将内容值绑定(bind)到模型对象的合适的字符串属性,应该没问题。

然后,添加一个新项目将只是通过数组 Controller 添加一个项目的问题。

因此,如果您不熟悉 NSArrayController 类和绑定(bind),以下是您如何在 Interface Builder 中执行此操作的简短说明。假设您的元素有一个名为 name 的字符串属性。

  1. 在您的 nib 文件的所有者(例如应用委托(delegate))中创建一个(可变的)数组属性来保存您的元素。
  2. 在 Interface Builder 中创建数组 Controller 对象。
  3. 将其内容数组绑定(bind)到您刚刚创建的数组属性。可以在 Xcode 的绑定(bind)检查器 (Cmd-Opt-7) 中设置绑定(bind)。
  4. 向窗口添加一个弹出按钮。
  5. 将弹出按钮的内容绑定(bind)到数组 Controller 的 arrangedObjects Controller 键。这是该绑定(bind)的默认选项。
  6. 将弹出按钮的内容值绑定(bind)到数组 Controller 的 arrangedObjects Controller 键和 name 模型键路径。这将在菜单中提供正确的文本。
  7. 在您的代码中的某处,创建一个排序描述符并将其设置在数组 Controller 上(使用 setSortDescriptors: 方法)。为此,您可能需要在文件所有者上定义一个导出来容纳阵列 Controller 。
  8. 要向弹出按钮添加新元素,请使用数组 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/

相关文章:

ios - ScrollView 中的多个图像

swift - Cocoapod 之后 Swift 中没有这样的模块错误

ios - 模态视图 Controller - 如何显示和关闭

iphone - iOS bundle 子文件夹目录

ios - header 在 Objective-C 中如何工作?

iphone - 是否可以在 iPhone 上录制 AAC/MP4 格式的音频?

cocoa - 读取 NSWindow 调整大小事件

iphone - 多线程实现的最佳方式

objective-c - 当现代运行时或自动合成的属性不可用时中止编译

cocoa - NSLog NSArray 的地址