2013-02-02 14 views
6

Próbuję utworzyć prosty NSTableView (tylko tekst), w którym można kliknąć widok komórki, aby edytować tekst. Wszystkie samouczki i podobne pytania sugerują, że jest to automatyczne zachowanie, ale nie mogę go uzyskać.Nie można edytować pliku NSTableView za pomocą kliknięcia

Nie mam problemu z połączeniem mojego delegata ze źródłami danych; Mogę programowo zapełnić wszystkie komórki i mogę dowiedzieć się, co zrobić z nowym tekstem wprowadzanym podczas edycji. ... Po prostu nie mogę otworzyć okna tekstowego do edycji!

(The NSTable kolumny są oznaczone jako edytowalny w IB)

Dzięki za wszelkie wskazówki.

+0

OK, żadnych odpowiedzi, ale może ktoś potwierdzić, że przynajmniej _should_ to być możliwe, aby kliknąć/podwójnie komórki w NSTableView, który otwiera pole tekstowe do edycji? Zaczynam się zastanawiać, czy moja instalacja Xcode jest zepsuta. W każdym samouczku, jaki mogę znaleźć, jest to normalne zachowanie bez wytłumaczenia, jak go utworzyć. Dzięki. –

+1

Okazuje się, że nie jest to zachowanie domyślne ani nie można go ustawić globalnie w IB. Musisz ręcznie zakodować każdą komórkę, aby była edytowalna podczas tworzenia ich w źródle danych/delegata. –

+0

Mam to samo pytanie. Jeśli możesz podać więcej szczegółów w oficjalnej odpowiedzi, byłoby to niesamowite. – Brett

Odpowiedz

6

W tableView: metoda delegata viewForTableColumn Musiałem specjalnie ustawić każdą komórkę do edycji.

Wygląda na to, że działa bez problemu po kilku tygodniach użytkowania, ale nadal uważam, że musi być jakoś mniej pracochłonna metoda.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 


    NSTableCellView *cellView; 
    if([tableColumn.identifier isEqualToString:@"word"]) 
    { 
     wordCellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     cellView = wordCellView; 
     [cellView.textField setEditable:YES]; // Make Cell Editable! 
    } 
} 
+0

Ustawienie do edycji było dla mnie kluczowe! Dzięki! – Brett

+2

Musisz zwrócić 'cellView' na końcu po prawej? – Arc676

+0

Świetny pomysł, ale w rzeczywistości nie jest to konieczne; patrz http://stackoverflow.com/a/28282459/341994. – matt

7

Można to zrobić w konstruktorze Interface wybierając komórkę pola tekstowego, a następnie za pomocą Inspektora Atrybuty, przejdź do menu rozwijanego zatytułowany „Zachowanie” i wybierz „edytowalne”.

Już samo to umożliwi dwukrotne kliknięcie pojedynczych komórek i stanie się edytowalnym polem tekstowym.

Aby dokonać zmiany wprowadzone mieć wpływ, trzeba będzie także realizować następujące metody z Protokołem NSTableViewDelegate: - (void) tableView: setObjectValue: forTableColumn: Rząd:

[Zobacz firmy Apple Docs dla ta funkcja] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSTableViewDataSource/tableView:objectValueForTableColumn:row :)

Jak zwykle, ta metoda będzie musiała zostać zaimplementowana w obiekcie, który ustawiłeś jako delegat dla obiektu NSTableView.

[Zobacz firmy Apple Docs na delegatów w przypadku, gdy chcesz przegląd nich] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18)

+0

Uważam, że chociaż podane przez ciebie linki mogły być zgodne z twoją odpowiedzią, ale teraz dokumentacja Apple mówi, że technika, którą podałeś w swojej odpowiedzi, dotyczyła wyłącznie widoków tabelowych opartych na komórkach. Teraz firma Apple zaleca, abyśmy używali widoków tabel opartych na widokach i zamiast używać metody delegatów, - (void) tableView: setObjectValue: forTableColumn: row: aby ustawić wartości, które wykorzystujemy jako cel/działanie. Czy ktoś może mi powiedzieć, jak pozwolić użytkownikowi edytować wartości tableView i uzyskać te wartości z powrotem do mojego modelu, używając target/action? – Kaydell

Powiązane problemy