2009-05-10 8 views
13

Piszę aplikację przy użyciu Core Data, aby kontrolować kilka NSTableViews. Mam przycisk dodawania, który tworzy nowy rekord w NSTableView. W jaki sposób ustawić fokus na nowy rekord po kliknięciu tego przycisku, aby móc natychmiast wpisać jego nazwę? To jest ten sam pomysł w iTunes, w którym natychmiast po kliknięciu przycisku dodawania listy odtwarzania fokus klawiatury zostaje przeniesiony do nowej linii, aby można było wpisać nazwę listy odtwarzania.Przenosi fokus do nowo dodanego rekordu w NSTableView

+0

W jaki sposób są przechowywane twoje dane? W kontrolerze macierzy? –

+0

Tak, jest w kontrolerze NSArrayController. – hekevintran

Odpowiedz

18

Dobrze, po pierwsze, jeśli jeszcze go nie masz, musisz utworzyć klasę kontrolera dla swojej aplikacji. Dodaj gniazdo dla NSArrayController, w którym przechowywane są twoje obiekty, oraz gniazdo dla NSTableView, które wyświetla obiekty, w interfejsie twojej klasy kontrolera.

IBOutlet NSArrayController *arrayController; 
IBOutlet NSTableView *tableView; 

połączyć z tych punktów na NSArrayController i NSTableView w IB. Następnie musisz utworzyć metodę IBAction, która jest wywoływana po naciśnięciu przycisku "Dodaj"; nazwać addButtonPressed: lub coś podobnego, deklarując ją w interfejsie klasy kontrolera:

- (IBAction)addButtonPressed:(id)sender; 

a także czyni go celem twojej przycisk „Dodaj” w IB.

Teraz musisz wdrożyć to działanie w implementacji klasy kontrolera; ten kod zakłada, że ​​obiekty dodane do kontrolera macierzy są NSString s; jeśli nie, zmień typ zmiennej new na dowolny dodawany typ obiektu.

//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]; 
} 

Będzie to nazwać po kliknięciu na przycisk „Dodaj”, a komórka w pierwszej kolumnie nowym wierszu zacznie być edytowane.

+0

NSArrayController ma IBAction "dodaj". Możesz połączyć przycisk z tą akcją. Czy możesz zadzwonić bezpośrednio? (Próbowałem, nie działa) Gdybyś mógł, musiałbyś stworzyć nowy obiekt taki jak ten, ale po prostu zadzwoń, dodaj? – Vojto

1

Uważam, że łatwiejszym i bardziej odpowiednim sposobem jest wdrożenie go w ten sposób.

-(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]; 

tj.

  1. Wdrożenie tableViewSelectionDidChange:(NSNotification *)notification
  2. pobrać wybrany indeks wiersza
  3. połączenia editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select stamtąd z indeksem wiersza.

Ważna uwaga: to rozwiązanie spowoduje również edycję, gdy użytkownik po prostu wybierze wiersz. Jeśli chcesz edytować tylko podczas dodawania nowego obiektu, nie jest to dla ciebie.