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
Odpowiedz
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.
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
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.
- Wdrożenie
tableViewSelectionDidChange:(NSNotification *)notification
- pobrać wybrany indeks wiersza
- 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.
W jaki sposób są przechowywane twoje dane? W kontrolerze macierzy? –
Tak, jest w kontrolerze NSArrayController. – hekevintran