7

我有一個學生類:如何獲得NSPopUpButton選定的對象?

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

和我有一個NSMutableArray的學生名單,並且我把它綁定到NSPopUpButton這樣

內容:studentArray,arrangedObjects 含量值:studentArray ,arrangedObjects,名

我可以讓學生對象是這樣的:

-(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

出於好奇,什麼是觸發'IBAction'列出? –

回答

7

你這樣做的方式很好。還有另一種方式,但不一定更好。

基本上彈出按鈕包含一個菜單,並在菜單中有菜單項。

在菜單項上有一個名爲representObject的屬性,您可以使用它來與學生創建關聯。

因此,您可以通過創建菜單項並將它們添加到菜單中來手動構建彈出按鈕。

3

我相信你這樣做的方式是最好的。由於NSPopUpButton正在被你的數組填充,它實際上並不包含該對象,它只是知道它在哪裏。個人而言,我會用

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

看着上NSPopUpButton的文檔後,我敢肯定,這是獲得對象的最有效方式。

3

我利用「NSMenuDidSendActionNotification」一旦用戶選擇了選擇恰當的NSMenuItem在NSPopUpButton的NSMenu是被髮送解決了這個問題。

您可以註冊觀察者在例如「awakeFromNib」像這樣

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

如果你有幾個NSPopUpButtons你可以註冊爲每一個觀察者。 不要忘記在dealloc中刪除觀察者(S):

[[NSNotificationCenter defaultCenter] removeObserver: self]; 

在popUpSelectionChanged您可以檢查標題,所以你知道哪個菜單實際發送通知。您可以在屬性檢查器中的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 ... 
    } 
}