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:
Alles anzeigen
Gruß Alex
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
- - (void) textDidEndEditing:(NSNotification *)notification {
- NSString* stringValue = ((NSTextView*)notification.object).string;
- int textMovement = [[notification.userInfo valueForKey:@"NSTextMovement"] intValue];
- if (NSReturnTextMovement == textMovement) {
- //[super textDidEndEditing:notification];
- NSText *fieldEditor = notification.object;
- // The row and column for the cell that just ended editing
- NSInteger row = [self rowAtPoint:fieldEditor.frame.origin];
- NSInteger col = [self columnAtPoint:fieldEditor.frame.origin];
- NSTableColumn* tableColumn = self.tableColumns [col];
- [self.dataSource tableView: self setObjectValue: stringValue forTableColumn: tableColumn row: row];
- if (++row >= self.numberOfRows) [self.window endEditingFor: fieldEditor];
- [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row]
- byExtendingSelection:NO];
- [self editColumn:col row:row withEvent:nil select:YES];
- }
- }
Gruß Alex