首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对NSPopUpButton进行排序

对NSPopUpButton进行排序
EN

Stack Overflow用户
提问于 2012-06-19 09:32:36
回答 3查看 1.6K关注 0票数 4

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

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-22 12:11:26

我已经成功地使用以下绑定对弹出按钮进行排序:

代码语言:javascript
复制
[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];

我还将init中的声明改为:

代码语言:javascript
复制
displayElements = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];

代码语言:javascript
复制
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,先前添加的子菜单将消失,如下图所示:

添加新项之前的

添加新项后的

当我们对元素排序时,也会显示相同的行为。

有什么办法解决这个问题吗?

票数 1
EN

Stack Overflow用户

发布于 2012-06-19 10:28:33

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

让数组控制器第一次使用弹出按钮可能有点棘手,但是如果将弹出按钮的内容绑定到数组控制器的arrangedObjects,然后将内容值绑定到模型对象的适当字符串属性,则应该可以。

然后,添加一个新项只是通过数组控制器添加一个项的问题。

因此,如果您不熟悉NSArrayController类和绑定,下面是关于如何在Interface中这样做的简短说明。假设元素有一个名为name的字符串属性。

  1. 在nib文件的所有者(例如,app委托)中创建一个(可变的)数组属性来保存元素。
  2. 在Interface中创建数组控制器对象。
  3. 将其内容数组绑定到您刚才创建的数组属性。绑定可以在Xcode的绑定检查器(Cmd 7)中设置。
  4. 向窗口添加一个弹出按钮。
  5. 设置弹出按钮的内容绑定到数组控制器的arrangedObjects控制器键。这是绑定的默认选项。
  6. 设置弹出按钮的内容值绑定到数组控制器的arrangedObjects控制器键和name模型键路径。这将在菜单中给出正确的文本。
  7. 在代码中的某个地方,创建一个排序描述符,并在数组控制器上设置它(使用setSortDescriptors:方法)。为此,您可能需要在文件所有者上定义一个保存数组控制器的出口。
  8. 若要向弹出按钮添加新元素,请使用数组控制器的add:方法。

这应该会让你拥有最少的自己的代码,以及一点界面生成器的魔力。

对于相当简单的UI元素,绑定确实可以节省大量工作。更多关于他们的这里

编辑以添加一个示例:

要了解如何做到这一点,请考虑一个具有应用程序委托的应用程序,该应用程序具有一个data属性、一个字典数组和一个name属性。请注意,这是一个比您的示例更深的抽象级别,其中数组只包含单个字符串。就我个人而言,我更喜欢那样。

代码语言:javascript
复制
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];
票数 2
EN

Stack Overflow用户

发布于 2012-06-20 13:24:24

谢谢你的回答@Monolo

我已经能够在NSArrayController的弹出窗口中加载这些值(这些值已经存储在NSArrayController中)。但我还是被分类的事缠住了。下面是代码,我无法理解它有什么问题。

ControllerClass.h

代码语言:javascript
复制
@interface ControllerClass : NSObject{
NSWindow *window;
NSArray *sortDescriptorArray;
NSMutableArray *displayElements;
NSSortDescriptor *sortDescriptor; 
IBOutlet NSArrayController *arrayController;
IBOutlet NSTextField *newItemTextField;
}
@property (readwrite,retain) NSMutableArray *displayElements;
-(id)init;
-(IBAction)AddItem:(id)sender;
@end

============================================================

ControllerClass.m

代码语言:javascript
复制
#import "ControllerClass.h"

@implementation ControllerClass
@synthesize displayElements;
-(id)init
{
    self =[super init];
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayElements" ascending:YES];
    sortDescriptorArray = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [arrayController setSortDescriptors:sortDescriptorArray];
    displayElements = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
    return self;
}

-(IBAction)AddItem:(id)sender
{
    [arrayController addObject:[newItemTextField stringValue]];
}
@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11098205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档