7

Mam klasę Student:jak zdobyć wybrany obiekt NSPopUpButton?

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

i mam NSMutableArray do listy studentów, a ja związany go do NSPopUpButton jak ten

treści: studentArray, arrangedObjects wartości treści: studentArray , arrangedObjects, nazwa

teraz mogę uzyskać obiekt studencką tak:

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

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

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

jest jakiś sposób, aby uzyskać obiekt ucznia bezpośrednio z NSPopUpButton ???? jak:

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

z ciekawości, co wywołuje listę "IBAction"? –

Odpowiedz

7

Sposób, w jaki to robisz, jest w porządku. Jest inny sposób, ale niekoniecznie lepszy.

Zasadniczo przycisk popup zawiera menu, aw menu są pozycje menu.

W menu nie ma właściwość o nazwie representedObject, których można użyć, aby utworzyć stowarzyszenie z uczniem.

Dlatego można zbudować przycisk podręczne ręcznie poprzez tworzenie elementów menu i dodając je do swojego menu.

3

Uważam, że sposób, w jaki robią to jest najlepszy. Ponieważ NSPopUpButton jest zapełniane przez twoją tablicę, to faktycznie nie zawiera obiektu, tylko wie, gdzie on jest. Osobiście używam

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

Po zapoznaniu się z dokumentacją dotyczącą NSPopUpButton Jestem pewien, że jest to najbardziej efektywny sposób pozyskania obiektu.

3

I rozwiązać problem poprzez wykorzystanie „NSMenuDidSendActionNotification”, która zostanie wysłana, gdy użytkownik wybrał approriate NSMenuItem w NSMenu z NSPopUpButton.

Możesz zarejestrować obserwatora np. „AwakeFromNib” jak to

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

Jeśli masz kilka NSPopUpButtons możesz zarejestrować obserwatora dla każdego z nich. Nie zapomnij usunąć obserwatora (ów) dealloc:

[[NSNotificationCenter defaultCenter] removeObserver: self]; 

W popUpSelectionChanged można sprawdzić tytuł więc wiesz, które menu faktycznie wysłane powiadomienie. Możesz ustawić tytuł w Kreatorze interfejsów w Inspektorze atrybutów.

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