2008-10-11 9 views
5

Potrzebuję wiedzieć, kiedy użytkownik zakończy edycję komórki w NSTableView. Tabela zawiera wszystkie kalendarze użytkowników (uzyskane z CalCalendarStore), więc aby zapisać zmiany użytkownika, muszę poinformować go o zmianach w CalCalendarStore. Jednak nie mogę znaleźć niczego, co zostanie wywołane po zakończeniu edycji przez użytkownika - domyślam się, że w delegacie tabeli istnieje metoda, ale widziałem tylko jeden, który jest wywoływany podczas edycji, a nie po zakończeniu edycji.Jak mogę otrzymać powiadomienie, gdy użytkownik zakończy edycję komórki w NSTableView?

Odpowiedz

2

Podklasa NSTableView i nadpisanie textDidEndEditing: (upewnij się, że wywołasz implementację super).

To będzie wywoływane tylko przez pola tekstowe NSTextFieldCell lub NSComboBoxCell (ale tylko przy zmianie wartości przez wpisanie jej, a nie przez wybranie wartości z menu kombi).

+0

Wygląda na to, że zadziała. Dziękuję Ci bardzo. :) – Andy

1

Sprawdź protokół NSTableDataSource. Wiadomość, której szukasz, nazywa się: tableView: setObjectValue: forTableColumn: wiersz:

+1

Prawdopodobnie jest to poprawna odpowiedź. Dzięki temu działa tylko z tabelą opartą na komórkach. Jeśli używasz tabeli opartej na widoku, ta metoda nigdy nie jest wywoływana. – dgatwood

1

To nie działa w moim przypadku. Ustawiłem klasę kontrolera jako DataSource na tabelę, ale metoda nigdy nie została wywołana. Dane są moje tabela jest związana z wartościami w NSArrayController - może to dlatego mój obiekt nie został wywołany?

2

Konfigurowanie obserwatorów dla każdej pozycji w treści tablicy używając addObserver: toObjectsAtIndexes: forKeyPath: Opcje: Kontekst:

Potrzebny będzie również ustawić obserwatora dla samej tablicy, tak że użytkownik zostanie powiadomiony o obiektach które są dodawane lub usuwane z tablicy.

Na przykład spójrz na projekt iSpend.

-1

Podklasa NSArrayController i przesłonięcie objectDidEndEditing: (należy się upewnić, że wywoływana jest implementacja super).

Będzie to głównie wywoływane tylko przez pola tekstowe NSTextFieldCell lub NSComboBoxCell (ale tylko przy zmianie wartości przez wpisanie jej, a nie przez wybranie wartości z menu kombi). Może być kilka innych komórek, które będą go wywoływały, ale nie jestem pewien, które. Jeśli masz niestandardową komórkę, rozważ wdrożenie nieformalnych protokołów NSEditor i NSEditorRegistration.

14

Możesz osiągnąć ten sam wynik bez podklasy NSTableView przy użyciu metody NSNotificationCenter lub przy użyciu metod NSControl. Zapoznaj się z dokumentacją firmy Apple tutaj:

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

To tylko kilka linii kodu i działało idealnie dla mnie.


Jeśli można być delegate z NSTableView wystarczy zaimplementować metodę

- (void)controlTextDidEndEditing:(NSNotification *)obj { ... } 

w rzeczywistości NSTableView jest delegate z NSControl elementów w niej zawartych, i przekazuje te metody wywołania jego delegate (Istnieją inne przydatne metody)

W przeciwnym razie użyj NSNotificationCenter:

// where you instantiate the table view 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:) 
    name:NSControlTextDidEndEditingNotification object:nil]; 

// somewhere else in the .m file 
- (void)editingDidEnd:(NSNotification *)notification { ... } 

// remove the observer in the dealloc 
- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
    name:NSControlTextDidEndEditingNotification object:nil]; 
    [super dealloc] 
} 
+1

To jest albo dobre, albo złe, w zależności od tego, czy używasz tabel opartych na komórkach, czy widoku. Jeśli używasz tabel opartych na komórkach, a twoim celem jest zapisanie zmian, to podejście nie zadziała, ponieważ to powiadomienie zostanie wysłane * przed * tableView: setObjectValue: forTableColumn: wiersz: metoda zostanie wywołana do przechowywania wartości w źródło danych, więc wypiszesz stare wartości. – dgatwood

+0

Właściwie to nie otrzymuję tego powiadomienia w widoku widoku opartym na widoku –

0

Przełożenie @ odpowiedź Milly jest w Swift 3:

// Setup editing completion notifications 
NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil) 

Funkcja obsłużyć zgłoszenie:

func editingDidEnd(_ obj: Notification) { 
    guard let newName = (obj.object as? NSTextField)?.stringValue else { 
     return 
    } 

    // post editing logic goes here 
} 
Powiązane problemy