2009-05-10 5 views
13

Sto scrivendo un'applicazione che utilizza Core Data per controllare alcune NSTableViews. Ho un pulsante Aggiungi che rende un nuovo record in NSTableView. Come faccio a spostare lo stato attivo sul nuovo record quando si fa clic su questo pulsante in modo da poter digitare immediatamente il suo nome? Questa è la stessa idea in iTunes, dove immediatamente dopo aver fatto clic sul pulsante aggiungi playlist, lo spostamento della tastiera viene spostato sulla nuova riga in modo da poter digitare il nome della playlist.Spostare lo stato attivo sul record appena aggiunto in un NSTableView

+0

Come vengono memorizzati i dati? In un controller di array? –

+0

Sì, è in un NSArrayController. – hekevintran

risposta

18

Ok, prima di tutto, se non ne hai già uno, devi creare una classe controller per la tua applicazione. Aggiungi una presa per lo NSArrayController in cui sono archiviati gli oggetti e una presa per lo NSTableView che visualizza gli oggetti nell'interfaccia della classe del controller.

IBOutlet NSArrayController *arrayController; 
IBOutlet NSTableView *tableView; 

Collegare queste prese al NSArrayController e la NSTableView in IB. Quindi è necessario creare un metodo IBAction chiamato quando si preme il pulsante "Aggiungi"; chiamare addButtonPressed: o qualcosa di simile, dichiarandolo nell'interfaccia classe controller:

- (IBAction)addButtonPressed:(id)sender; 

e anche che la rende la destinazione del pulsante "Aggiungi" in IB.

Ora è necessario implementare questa azione nell'implementazione della classe controller; questo codice presuppone che gli oggetti aggiunti al controller di array siano NSString s; se non lo sono, sostituire il tipo della variabile new con qualsiasi tipo di oggetto che si sta aggiungendo.

//Code is an adaptation of an excerpt from "Cocoa Programming for 
//Mac OS X" by Aaron Hillegass 
- (IBAction)addButtonPressed:(id)sender 
{ 
//Try to end any editing that is taking place in the table view 
NSWindow *w = [tableView window]; 
BOOL endEdit = [w makeFirstResponder:w]; 
if(!endEdit) 
    return; 

//Create a new object to add to your NSTableView; replace NSString with 
//whatever type the objects in your array controller are 
NSString *new = [arrayController newObject]; 

//Add the object to your array controller 
[arrayController addObject:new]; 
[new release]; 

//Rearrange the objects if there is a sort on any of the columns 
[arrayController rearrangeObjects]; 

//Retrieve an array of the objects in your array controller and calculate 
//which row your new object is in 
NSArray *array = [arrayController arrangedObjects]; 
NSUInteger row = [array indexOfObjectIdenticalTo:new]; 

//Begin editing of the cell containing the new object 
[tableView editColumn:0 row:row withEvent:nil select:YES]; 
} 

Questo sarà poi chiamato quando si fa clic sul pulsante "Aggiungi", e la cella nella prima colonna della nuova riga inizierà da modificare.

+0

NSArrayController ha IBAction "aggiungi". È possibile collegare un pulsante a questa azione. Potete chiamarlo direttamente? (L'ho provato, non funziona) Se potessi, dovresti creare un nuovo oggetto come questo, ma basta chiamare add, giusto? – Vojto

1

Credo che un modo più semplice e corretto per farlo sia implementandolo in questo modo.

-(void)tableViewSelectionDidChange:(NSNotification *)notification { 
    NSLog(@"%s",__PRETTY_FUNCTION__); 
    NSTableView *tableView = [notification object]; 
    NSInteger selectedRowIndex = [tableView selectedRow]; 
    NSLog(@"%ld selected row", selectedRowIndex); 

    [tableView editColumn:0 row:selectedRowIndex withEvent:nil select:YES]; 

I.e.

  1. Implementare tableViewSelectionDidChange:(NSNotification *)notification
  2. recuperare l'indice di riga selezionata
  3. chiamata editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select da lì con l'indice di riga.

Nota importante: questa soluzione attiva anche la modifica quando l'utente seleziona semplicemente una riga. Se vuoi solo la modifica innescata quando aggiungi un nuovo oggetto, questo non fa per te.