NSTableView und Return-Key

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSTableView und Return-Key

    Hallo an alle,

    ich habe ein merkwürdiges Problem, das ich mir nicht so recht erklären kann und an dem ich schon seit Tagen bastel. Und zwar soll bei Drücken der Return-Taste das TextField in der nächsten Zeile zum Bearbeiten aufgehen. Jetzt werdet ihr evtl. sagen: "Hä?! Das ist doch auch so..". Habe ich auch schon gelesen. Bei mir komischerweise nicht.. Ich habe eine eigene Subclass von NSTableView. Dort habe ich aber lediglich drawGridInClipRect: und menuForEvent: überschrieben. Nun habe ich beim Googlen eine Methode gefunden, in der textDidEndEditing: überschrieben wird. Das funktioniert auch so weit, allerdings nur, wenn ich nicht [super textDidEndEditing: notif] aufrufe. Wenn ich das aber nicht mache, dann wird natürlich der eingegebene Text nicht übernommen. Kein Problem - dachte ich - dann rufe ich einfach tableView:setObjectValue:forTableColumn:row: der DataSource auf..

    Und jetzt wirds komisch: wenn ich meine Implementierung der Methode in der DataSource auskommentiere, dann wird zwar auch kein neuer Wert ins Textfeld geschrieben, aber das Weiterspringen funktioniert. Sobald aber in irgendeiner Weise dort mein Model aktualisiert wird, dann wird einfach die nächste Row selektiert und die Tabelle verliert den Fokus..

    Kann sich das jemand erklären? Hier meine Implementierung von textDidEndEditing: in der TableView-Subclass:

    Quellcode

    1. - (void) textDidEndEditing:(NSNotification *)notification {
    2. NSString* stringValue = ((NSTextView*)notification.object).string;
    3. int textMovement = [[notification.userInfo valueForKey:@"NSTextMovement"] intValue];
    4. if (NSReturnTextMovement == textMovement) {
    5. //[super textDidEndEditing:notification];
    6. NSText *fieldEditor = notification.object;
    7. // The row and column for the cell that just ended editing
    8. NSInteger row = [self rowAtPoint:fieldEditor.frame.origin];
    9. NSInteger col = [self columnAtPoint:fieldEditor.frame.origin];
    10. NSTableColumn* tableColumn = self.tableColumns [col];
    11. [self.dataSource tableView: self setObjectValue: stringValue forTableColumn: tableColumn row: row];
    12. if (++row >= self.numberOfRows) [self.window endEditingFor: fieldEditor];
    13. [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row]
    14. byExtendingSelection:NO];
    15. [self editColumn:col row:row withEvent:nil select:YES];
    16. }
    17. }
    Alles anzeigen




    Gruß Alex
  • So, hab es (endlich) rausgefunden. In meinem Controller, der auch die DataSource des TableViews ist, bin ich für eine NSManagedObjectContextObjectsDidChangeNotification angemeldet. Da in tableView:setObjectValue:forTableColumn:row: mein Model geändert wird und sich dementsprechend ManagedObjects ändern, wird die Notification gepostet. Im angegebenen Selector, der daraufhin ausgeführt wird, wird die TableView reloaded, was dann dazu führt, dass das Editing beendet wird..

    Habe entsprechend den Selector geändert und reloade nur noch, wenn relevante Objekte, die auch in der TableView angezeigt werden, hinzugefügt oder gelöscht wurden..

    Danke trotzdem für Kopf zerbrechen.. ;)