2012-02-25 10 views
7

estoy pasando de iOS para Cacao y tratando de salir del paso mis primeros programas. Pensé que sería simple agregar un NSComboBox a mi formulario, bueno esa parte era. Añadí <NSComboBoxDelegate, NSComboBoxDataSource> a mi interfaz, dos devoluciones de llamada de datos, y el notificador:Programación de cacao, estableciendo el delegado

@interface spcAppDelegate : NSObject <NSApplicationDelegate, 
         NSComboBoxDelegate, NSComboBoxDataSource> 

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index; 
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox; 

- (void)comboBoxSelectionDidChange:(NSNotification *)notification; 

@end 

I Control arrastré el cuadro combinado con el delegado de la aplicación (que es la única clase en mi sencilla aplicación por defecto) y cable hasta el delegado y los datos fuente pero ninguno de esos eventos dispara. Pensé que el delegado de la aplicación era correcto, pero como no se activó, también probé "propietario del archivo" y "aplicación". No pensé que esos funcionarían y no lo hicieron.

¿Cuál es la forma correcta de cable hasta la fuente delegado/datos para una NSComboBox en una aplicación Cocoa?

Gracias!

+0

Cuando se dice "que no disparó," ¿Qué estás haciendo para probar eso? Punto de interrupción en el depurador NSLog? Por – user1118321

+0

"No se disparó" me refiero a que he añadido los métodos de delegado y establecer un punto de interrupción en los que no se alcanzó. Usted probablemente está pensando que tiene sentido que no se alcanzaron los dos métodos de datos, sino que debería haber sido comboBoxSelectionDidChange alcanzable. Nuevamente mi culpa ya que había conectado ese evento incorrectamente. Así que en realidad tenía dos problemas, pero la solución principal era darme cuenta de que había una (¿nueva?) Casilla de verificación para indicar que estaba usando una fuente de datos. Gracias :) – simusid

Respuesta

15

con tal que usted realmente ha implementado esos métodos en su archivo spcAppDelegate.m, es posible que desee volver a verificar que Uses Data Source está marcada para el NSComboBox en el archivo de la semilla en el Interface Builder:

enter image description here

Tenga en cuenta que no fue establecido por defecto en un proyecto de prueba rápida que creé. Correr sin ese conjunto casilla de verificación debe registrar el siguiente a la consola cuando se inicie la aplicación:

NSComboBox[2236:403] *** -[NSComboBox setDataSource:] should not be called when 
      usesDataSource is set to NO 
NSComboBox[2236:403] *** -[NSComboBoxCell setDataSource:] should not be called 
      when usesDataSource is set to NO 

Mientras que el NSComboBox Class Reference es algo muy útil, cuando era primer aprendizaje, he encontrado que si hubiera guías acompañantes vinculados a una clase , esos fueron mucho más útiles para entender cómo uno debería usar la clase en la práctica. Si nos fijamos en la parte superior de la referencia NSComboBox clase en la Guía Companion, verá Combo Box Programming Topics.

Para configurar un cuadro combinado que utiliza una fuente de datos, se puede usar algo como lo siguiente:

spcAppDelegate.h:

#import <Cocoa/Cocoa.h> 

@interface spcAppDelegate : NSObject <NSApplicationDelegate, 
        NSComboBoxDelegate, NSComboBoxDataSource> { 
    IBOutlet NSWindow   *window; 
    IBOutlet NSComboBox   *comboBox; 
    NSMutableArray    *comboBoxItems; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

spcAppDelegate.m:

#import "spcAppDelegate.h" 
@implementation spcAppDelegate 
@synthesize window; 
- (id)init { 
    if ((self = [super init])) { 
     comboBoxItems = [[NSMutableArray alloc] initWithArray: 
       [@"Cocoa Programming setting the delegate" 
             componentsSeparatedByString:@" "]]; 
    } 
    return self; 
} 
- (void)dealloc { 
    [comboBoxItems release]; 
    [super dealloc]; 
} 
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox { 
    return [comboBoxItems count]; 
} 
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { 
    if (aComboBox == comboBox) { 
     return [comboBoxItems objectAtIndex:index]; 
    } 
    return nil; 
} 
- (void)comboBoxSelectionDidChange:(NSNotification *)notification { 
    NSLog(@"[%@ %@] value == %@", NSStringFromClass([self class]), 
     NSStringFromSelector(_cmd), [comboBoxItems objectAtIndex: 
     [(NSComboBox *)[notification object] indexOfSelectedItem]]); 

} 
@end 

Proyecto de muestra: http://github.com/NSGod/NSComboBox.

+1

Muchas gracias. Fue "fuente de datos de uso". He hecho * casi * todo bien :) – simusid

+0

¡Gracias por todos los detalles! Súper útil –

+0

Esto es increíblemente frustrante, incluso en OS 10.11 & Xcode 8 NO funcionará si no marca la casilla en el Xib - ¡incluso si establece 'comboBox.usesDataSource = true' programmatically! – Nathaniel

0

que estaba teniendo una situación similar ayer hasta que recordé a conectar la fuente de datos propietario del archivo a la IBOutlet en IB:

enter image description here

Cuestiones relacionadas