2008-10-11 7 views
5

Ich muss wissen, wenn der Benutzer die Bearbeitung einer Zelle in einem NSTableView beendet. Die Tabelle enthält alle Kalender des Benutzers (aus dem CalCalendarStore), damit die Änderungen des Benutzers gespeichert werden, muss ich den CalCalendarStore über die Änderungen informieren. Ich kann jedoch nichts finden, was nach dem Editieren des Benutzers aufgerufen wird - ich würde vermuten, dass es eine Methode im delegate der Tabelle geben würde, aber ich habe nur eine gesehen, die beim Editieren aufgerufen wird, nicht beim Editieren.Wie kann ich benachrichtigt werden, wenn der Benutzer die Bearbeitung einer Zelle in einem NSTableView beendet hat?

Antwort

2

Unterklasse NSTableView und override textDidEndEditing: (Achten Sie darauf, die Super-Implementierung aufzurufen).

Dies wird nur von den Textfeldern NSTextFieldCell oder NSComboBoxCell aufgerufen (aber nur, wenn Sie den Wert ändern, indem Sie ihn eingeben, nicht indem Sie den Wert aus dem Kombinationsmenü auswählen).

+0

Das sieht so aus, als würde es funktionieren. Vielen Dank. :) – Andy

1

Schauen Sie in das NSTableDataSource-Protokoll. Die Nachricht, nach der Sie suchen, heißt: tableView: setObjectValue: forTableColumn: row:

+1

Dies ist wahrscheinlich die richtige Antwort. Damit funktioniert es nur mit einer zellenbasierten Tabelle. Wenn Sie eine View-basierte Tabelle verwenden, wird diese Methode nie aufgerufen. – dgatwood

1

Das scheint in meinem Fall nicht zu funktionieren. Ich habe meine Controller-Klasse als DataSource für die Tabelle festgelegt, aber die Methode wurde nie aufgerufen. Die Daten sind, dass meine Tabelle an die Werte in einem NSArrayController gebunden ist - könnte deshalb mein Objekt nicht aufgerufen worden sein?

2

Beobachter im Content-Array für jedes Element aufgebauter addObserver: toObjectsAtIndexes: forKeyPath: Optionen: Kontext:

Sie müssen auch einen Beobachter für das Array gesetzt selbst, so dass Sie über Objekte benachrichtigt werden Diese werden zum Array hinzugefügt oder daraus entfernt. Für ein Beispiel sehen Sie sich das Projekt iSpend an.

-1

Unterklasse NSArrayController und override objectDidEndEditing: (Achten Sie darauf, die Super-Implementierung aufzurufen).

Dies wird meist nur durch die Textfelder NSTextFieldCell oder NSComboBoxCell aufgerufen (aber nur wenn der Wert durch Eingabe geändert wird, nicht durch Auswahl des Wertes aus dem Menü der Combo). Es kann ein paar andere Zellen geben, die es aufrufen, aber ich bin mir nicht sicher, welche. Wenn Sie über eine benutzerdefinierte Zelle verfügen, sollten Sie die informellen Protokolle NSEditor und NSEditorRegistration implementieren.

14

Sie können dasselbe Ergebnis ohne Unterklassen NSTableView erreichen, indem Sie NSNotificationCenter oder NSControl verwenden. Finden Sie in der Apple-Dokumentation hier:

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

Es ist nur ein paar Zeilen Code und funktionierte perfekt für mich.


Wenn Sie die delegate der sein die NSTableView Sie müssen nur die Methode

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

In der Tat umzusetzen, NSTableView ist die delegate der NSControl Elemente enthält, und leitet diejenigen Methodenaufrufe sein delegate (Es gibt andere Methoden, die nützlich sind)

Verwenden Sie andernfalls die 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

Nun, das ist entweder richtig oder falsch, je nachdem, ob Sie zellbasierte oder View-basierte Tabellen verwenden. Wenn Sie zellenbasierte Tabellen verwenden und Ihr Ziel darin besteht, die Änderungen zu schreiben, funktioniert diese Methode nicht, da diese Benachrichtigung gesendet wird, * bevor * tableView: setObjectValue: forTableColumn: row: method aufgerufen wird, um die Werte zu speichern die Datenquelle, so dass Sie die alten Werte schreiben werden. – dgatwood

+0

Eigentlich bekomme ich diese Benachrichtigung überhaupt nicht in einer ansichtsbasierten Tabellenansicht –

0

Übersetzen @ Milly Antwort in Swift 3:

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

Funktion Benachrichtigung zu handhaben:

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

    // post editing logic goes here 
}