7

Sto avendo una classe di studenti:come ottenere l'oggetto selezionato NSPopUpButton?

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

e ho un NSMutableArray per la lista degli studenti, e ho legato ad un NSPopUpButton come questo contenuto

: studentArray, arrangedObjects valori di contenuto: studentArray , arrangedObjects, nome

ora posso ottenere l'oggetto degli studenti in questo modo:

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

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

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

c'è un modo per ottenere direttamente l'oggetto studente da NSPopUpButton ???? Mi piace:

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

per curiosità, cosa sta attivando l'IBAction? –

risposta

7

Il modo in cui lo state facendo va bene. C'è un altro modo, ma non necessariamente migliore.

Fondamentalmente il pulsante popup contiene un menu e nel menu ci sono voci di menu.

Sulla voce di menu c'è una proprietà denominata representato, che è possibile utilizzare per creare un'associazione con uno studente.

Pertanto è possibile creare manualmente il pulsante popup creando voci di menu e aggiungendole al menu.

3

Credo che il modo in cui lo stai facendo sia il migliore. Poiché lo NSPopUpButton viene popolato dall'array, in realtà non contiene l'oggetto, ma sa solo dove si trova. Personalmente vorrei utilizzare

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

Dopo aver esaminato la documentazione sul NSPopUpButton Sono sicuro che questo è il modo più efficace per ottenere l'oggetto.

3

ho risolto il problema utilizzando il "NSMenuDidSendActionNotification" che viene inviato una volta che l'utente ha scelto il approriate NSMenuItem nel NSMenu del NSPopUpButton.

È possibile registrare l'osservatore in, ad es. "AwakeFromNib" come questo

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

Se si dispone di diversi NSPopUpButtons è possibile registrare un osservatore per ciascuno di essi. Non dimenticare di rimuovere l'osservatore (s) in dealloc:

[[NSNotificationCenter defaultCenter] removeObserver: self]; 

In popUpSelectionChanged è possibile controllare il titolo in modo da sapere quale menu effettivamente inviata la notifica. Puoi impostare il titolo in Interface Builder nell'Inspector degli attributi.

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