8

我有一个学生班:

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

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

内容:学生数组、排列对象 内容值:学生数组、排列对象、名称

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

-(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];
4

3 回答 3

7

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

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

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

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

于 2012-08-22T16:08:24.030 回答
3

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

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

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

于 2012-08-22T15:52:12.940 回答
3

我通过利用一旦用户在 NSPopUpButton 的 NSMenu 中选择了适当的 NSMenuItem 就会发送的“ NSMenuDidSendActionNotification ”解决了这个问题。

您可以像这样在例如“awakeFromNib”中注册观察者

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

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

[[NSNotificationCenter defaultCenter] removeObserver: self];

在 popUpSelectionChanged 中,您可以检查标题,以便知道哪个菜单实际发送了通知。您可以在 Attributes Inspector 的 Interface Builder 中设置标题。

- (void)popUpSelectionChanged:(NSNotification *)notification {    
    NSDictionary *info = [notification userInfo];
    if ([[[[info objectForKey:@"MenuItem"] menu] title] isEqualToString:@"<title of menu of myPopUpButton>"]) {
        // do useful things ...
    }
}
于 2012-12-15T21:51:27.870 回答