7

estoy teniendo una clase de estudiante:cómo obtener el objeto seleccionado NSPopUpButton?

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

y tengo una NSMutableArray para la lista de los estudiantes, y con destino a un NSPopUpButton como este contenido

: studentArray, arrangedObjects valores de contenido: studentArray , arrangedObjects, nombre

ahora pueden obtener el objeto del estudiante como esto:

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

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

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

¿hay alguna manera de que pueda obtener el objeto de estudiante directamente desde NSPopUpButton ???? como:

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

por curiosidad, ¿qué está provocando el 'IBAction' en la lista? –

Respuesta

7

La forma en que lo está haciendo está bien. Hay otra manera, pero no necesariamente mejor.

Básicamente, el botón emergente contiene un menú, y en el menú hay elementos de menú.

En el elemento del menú hay una propiedad llamada representObject, que puede usar para crear una asociación con un alumno.

Por lo tanto, puede crear su botón emergente manualmente creando elementos de menú y agregándolos a su menú.

3

Creo que la forma en que lo está haciendo es la mejor. Como el NSPopUpButton está siendo poblado por su matriz, en realidad no contiene el objeto, solo sabe dónde está. En lo personal me gustaría utilizar

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

Después de buscar en la documentación sobre NSPopUpButton Estoy seguro de que esta es la forma más eficaz para obtener el objeto.

3

He resuelto el problema mediante la utilización de la "NSMenuDidSendActionNotification" que se envía una vez que el usuario ha elegido el approriate NSMenuItem en el NSMenu del NSPopUpButton.

Puede registrar al observador en, por ejemplo, "AwakeFromNib" como esto

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

Si tiene varios NSPopUpButtons que puede registrar un observador para cada uno. No se olvide de quitar el observador (s) en dealloc:

[[NSNotificationCenter defaultCenter] removeObserver: self]; 

En popUpSelectionChanged se puede comprobar el título por uno que qué menú llega a enviar la notificación. Puede establecer el título en Interface Builder en el Inspector de Atributos.

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