2012-02-25 17 views
7

Sto passando da iOS a Cocoa e sto cercando di confondere i miei primi programmi. Ho pensato che sarebbe stato semplice aggiungere uno NSComboBox al mio modulo, beh quella parte era. Ho aggiunto <NSComboBoxDelegate, NSComboBoxDataSource> alla mia interfaccia, due callback di dati, e il notificante:Programmazione cacao, impostazione del delegato

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

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

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

@end 

io controllo trascinato la casella combinata al delegato app (che è l'unica classe a mio semplice applicazione di default) e cablato il delegato e dei dati fonte ma nessuno di quegli eventi ha sparato. Pensavo che il delegato dell'app fosse corretto ma, poiché non ha funzionato, ho provato anche "proprietario di file" e "applicazione". Non pensavo che funzionassero e loro no.

Qual è il modo corretto per cablare il delegato/origine dati per un NSComboBox in un'app Cocoa?

Grazie!

+0

Quando si dice "non è scattato," che cosa stai facendo per testarlo? Punto di interruzione nel debugger? NSLog? – user1118321

+0

Per "non ha sparato" intendo che ho aggiunto i metodi delegati e impostato un punto di interruzione in essi che non è stato raggiunto. Probabilmente stai pensando che abbia senso che i due metodi dati non siano stati raggiunti ma che comboBoxSelectionDidChange avrebbe dovuto essere raggiungibile. Di nuovo colpa mia perché avevo cablato quell'evento in modo errato. Quindi in realtà avevo due propblems ma la correzione primaria si stava rendendo conto che c'era una (nuova?) Casella di controllo per indicare che stavo usando un'origine dati. Grazie :) – simusid

risposta

15

A condizione che hai effettivamente implementato i metodi nel file spcAppDelegate.m, si consiglia di controllare due volte che Uses Data Source sia selezionata per la NSComboBox nel file pennino in Interface Builder:

enter image description here

Si noti che non è stato impostato di default in un progetto di test rapido che ho creato. L'esecuzione, senza che un gruppo di caselle dovrebbe registrare il seguente di consolare quando si avvia l'applicazione:

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 

Mentre il NSComboBox Class Reference è un po 'utile, quando ero primo apprendimento, ho scoperto che se ci fossero guide compagno legati a per una classe , quelli erano molto più utili per capire come si dovrebbe usare la classe nella pratica. Se si guarda la parte superiore del riferimento di classe NSComboBox alla Guida Companion, verrà visualizzato Combo Box Programming Topics.

Per impostare una casella combinata che utilizza una fonte di dati, è possibile utilizzare qualcosa come il seguente:

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 

Progetto di esempio: http://github.com/NSGod/NSComboBox.

+1

Grazie mille. Era "usa la fonte dei dati". Avevo fatto * quasi * tutto bene :) – simusid

+0

Grazie per tutti i dettagli! Super utile –

+0

Questo è incredibilmente frustrante che anche in OS 10.11 e Xcode 8 non funzionerà se non si spunta la casella nello Xib - anche se si imposta 'comboBox.usesDataSource = true' a livello di programmazione! – Nathaniel

0

ho avuto una situazione simile ieri fino mi sono ricordato di collegare l'origine dati di file proprietario al IBOutlet in IB:

enter image description here

Problemi correlati