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
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).
Sprawdź protokół NSTableDataSource. Wiadomość, której szukasz, nazywa się: tableView: setObjectValue: forTableColumn: wiersz:
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
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?
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.
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.
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]
}
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
Właściwie to nie otrzymuję tego powiadomienia w widoku widoku opartym na widoku –
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
}
- 1. Jak otrzymać powiadomienie, gdy powiadomienie zostanie zgłoszone?
- 2. Jak otrzymać powiadomienie, gdy użytkownik zmieni hasło lub zażąda zresetowania hasła?
- 3. Jak wysłać i otrzymać powiadomienie?
- 4. Jak otrzymać powiadomienie, gdy UIView odłączy się od swojego superView?
- 5. QTableView - nie zezwala użytkownikowi na edycję komórki
- 6. Android: Get powiadomienie, gdy użytkownik wchodzi w określonej lokalizacji
- 7. Jak mogę otrzymać powiadomienie, gdy nowe okno zostanie utworzone na Win32?
- 8. Jak otrzymać powiadomienie po zamknięciu okna w rozszerzeniu przeglądarki Firefox?
- 9. otrzymasz powiadomienie, gdy UITextField stanie się FirstResponder
- 10. Aplikacja zakończy powiadomienie i zapisuje wersję roboczą (dane podstawowe)
- 11. Silverlight: Jak otrzymać powiadomienie o zmianie w dziedziczonej zależności DependencyProperty
- 12. Jak otrzymać powiadomienie o zmianie siatki w systemie AngularJS ui-grid?
- 13. Jak otrzymać powiadomienie o zmianie ustawień regionalnych systemu Android?
- 14. Jak mogę otrzymać pakiet "rcom"?
- 15. Jak ustalić, czy użytkownik przewinął do końca NSTableView
- 16. Jak otrzymać powiadomienie, gdy status SMS zmieni się z "Kolejki" na "Wysłane"?
- 17. Jak mogę poczekać, aż użytkownik zakończy zapisywanie w tekście, aby wywołać funkcję?
- 18. Wysyłaj powiadomienie Jenkins tylko wtedy, gdy nowy test zakończy się niepowodzeniem.
- 19. Jak otrzymać powiadomienie o akcji wypisania obserwatora w niestandardowym Obserwowalnym w RxJava
- 20. Czy jest powiadomienie, gdy ASP.NET Web API zakończy wysyłanie do klienta
- 21. Jak otrzymać plik za pomocą NFC (Android Beam) w Androidzie
- 22. Windows.h - Powiadomienie, gdy fokus wprowadzi wpis tekstowy
- 23. Kakao NSView w komórce NSTableView
- 24. Czy mogę vim zrobić edycję wielowierszową?
- 25. Czy mogę bezpiecznie polegać na IsBackground w wątkach, gdy aplikacja się zakończy?
- 26. Jak mogę uniknąć lub odrzucić powiadomienie o parowaniu Bluetooth w Androidzie, gdy robię parowanie programowe?
- 27. MonoTouchDesignServerUnified nieoczekiwanie zakończy pracę
- 28. Jak mogę użyć mapy i otrzymać indeks również w Scali?
- 29. UIDeviceOrientationDidChangeNotyfikacja zdarzenia nie wyzwalana, gdy użytkownik wyłącza automatyczne obracanie ekranu
- 30. Powiadomienie, gdy wyświetlacz zostanie podłączony lub odłączony
Wygląda na to, że zadziała. Dziękuję Ci bardzo. :) – Andy