我正在上学生课程:
@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];
答案 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 ...
}
}