我有一个元素列表,需要在NSPopUpButton中显示。我希望PopUp按钮按字母顺序显示列表。此外,列表中还有一个新的MenuItem,它将从文本字段中提取一个字符串并将其插入到PopUp按钮中。因此,我想问两个问题:
发布于 2012-06-22 12:11:26
我已经成功地使用以下绑定对弹出按钮进行排序:
[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中的声明改为:
displayElements = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];至
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,先前添加的子菜单将消失,如下图所示:
添加新项之前的:

添加新项后的:

当我们对元素排序时,也会显示相同的行为。
有什么办法解决这个问题吗?
发布于 2012-06-19 10:28:33
如果您使用NSArrayController填充弹出按钮(或者更确切地说,它的菜单),那么您可以定义一个排序描述符来处理排序。
让数组控制器第一次使用弹出按钮可能有点棘手,但是如果将弹出按钮的内容绑定到数组控制器的arrangedObjects,然后将内容值绑定到模型对象的适当字符串属性,则应该可以。
然后,添加一个新项只是通过数组控制器添加一个项的问题。
因此,如果您不熟悉NSArrayController类和绑定,下面是关于如何在Interface中这样做的简短说明。假设元素有一个名为name的字符串属性。
arrangedObjects控制器键。这是绑定的默认选项。arrangedObjects控制器键和name模型键路径。这将在菜单中给出正确的文本。setSortDescriptors:方法)。为此,您可能需要在文件所有者上定义一个保存数组控制器的出口。add:方法。这应该会让你拥有最少的自己的代码,以及一点界面生成器的魔力。
对于相当简单的UI元素,绑定确实可以节省大量工作。更多关于他们的这里。
编辑以添加一个示例:
要了解如何做到这一点,请考虑一个具有应用程序委托的应用程序,该应用程序具有一个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];发布于 2012-06-20 13:24:24
谢谢你的回答@Monolo
我已经能够在NSArrayController的弹出窗口中加载这些值(这些值已经存储在NSArrayController中)。但我还是被分类的事缠住了。下面是代码,我无法理解它有什么问题。
ControllerClass.h
@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
#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]];
}
@endhttps://stackoverflow.com/questions/11098205
复制相似问题