如何获取NSPopUpButton所选对象?

时间:2012-08-22 14:19:45

标签: objective-c cocoa nsmutablearray cocoa-bindings nspopupbutton

我正在上学生课程:

@interface student : NSObject{    
    NSString *name;
    NSDate *date;
}

我有一个NSMutableArray用于学生列表,我把它绑定到像这样的NSPopUpButton

内容:studentArray,arrangeObjects 内容值:studentArray,arrangeObjects,name

现在我可以得到这样的学生对象:

-(IBAction)studentPopupItemSelected:(id)sender
{ 
    NSPopUpButton *btn = (NSPopUpButton*)sender;

    int index = [btn indexOfSelectedItem];  
    student *std = [studentArray objectAtIndex:index];

    NSLog(@"%@ => %@", [std name], [std date]);
}

有什么方法可以直接从NSPopUpButton获取学生对象????像:

NSPopUpButton *btn = (NSPopUpButton*)sender;
student *std = (student *)[btn objectValueOfSelectedItem];

3 个答案:

答案 0 :(得分:7)

你这样做的方式很好。还有另一种方式,但不一定更好。

基本上弹出按钮包含一个菜单,在菜单中有菜单项。

在菜单项上有一个名为representObject的属性,您可以使用该属性创建与学生的关联。

因此,您可以通过创建菜单项并将其添加到菜单来手动构建弹出按钮。

答案 1 :(得分:3)

我相信你这样做的方式是最好的。由于数组正在填充NSPopUpButton,因此实际上并不包含该对象,它只知道它在哪里。我会个人使用

-(IBAction)studentPopupItemSelected:(id)sender {
     student *std = [studentArray objectAtIndex:[sender indexOfSelectedItem]];
     NSLog(@"%@ => %@", [std name], [std date]);
}

查看NSPopUpButton上的文档后,我确信这是获取对象的最有效方法。

答案 2 :(得分:3)

我通过利用“ NSMenuDidSendActionNotification ”解决了这个问题,一旦用户在NSPopUpButton的NSMenu中选择了相应的NSMenuItem,就会发送该文件。

您可以在以下情况下注册观察员像这样的“awakeFromNib”

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(popUpSelectionChanged:)
                                             name:NSMenuDidSendActionNotification
                                           object:[[self myPopUpButton] menu]];

如果你有几个NSPopUpButtons,你可以为每个注册一个观察者。 不要忘记删除dealloc中的观察者:

[[NSNotificationCenter defaultCenter] removeObserver: self];

在popUpSelectionChanged中,您可以检查标题,以便了解实际发送通知的菜单。您可以在“属性”检查器中的“界面生成器”中设置标题。

- (void)popUpSelectionChanged:(NSNotification *)notification {    
    NSDictionary *info = [notification userInfo];
    if ([[[[info objectForKey:@"MenuItem"] menu] title] isEqualToString:@"<title of menu of myPopUpButton>"]) {
        // do useful things ...
    }
}