• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

reloadData bei NSTableView funktioniert nicht

Muly

Jonagold
Registriert
17.11.08
Beiträge
19
Hi Leute,
ich habe vor kurzem mit Cocoa-Programmieren angefangen. Trotz meiner Erfahrungen mit Java habe ich noch einige Schwierigkeiten. Ich verdeutliche mein Problem an einem kleinen Beispielprogramm.
Mein Ziel ist es in diesem Beispiel, Personen in einer Tabelle zu verwalten. Dazu habe ich eine Klasse "Person" mit Name und Alter.
in AppDelegate erstelle ich ein NSMutableArray zur Verwaltung und füge in "init" schon mal drei Personen hinzu. Außerdem mache ich IBOutlets für ein NSTextField und für die Tabelle und eine IBAction zum hinzufügen von Personen.

Nun gehe ich in die XIB-Datei. ich füge ein Textfeld, eine Tabelle, einen Butten und einen ArrayController hinzu. Ich belege den Typ des Controllers mit "Person" und füge die keys hinzu. An diese werden die Columns gebunden.

Bis hierhin funktioniert auch alles wunderbar: die 3 Personen des Arrays werden angezeigt und sind veränderbar.

Der Add-Butten funktioniert auch, aber nur wenn ich die standard Add-Funktion vom Controller verwende. Dann erscheinen neue Personen mit Standardnamen in der Tabelle. Schön und gut, ich will aber, dass der Name, den ich in das TextField geschrieben habe, durch den Butten in die Liste eingetragen wird.
Also lasse ich das mit dem standard-Add und mache mir meine eigene Add-Funktion durch die IBAction in AppDelegate. ich nehme also den Inhalt des Textfields und bastle daraus eine Person und füge sie dem Array hinzu. Funktioniert auch super.
Abschließend will ich natürlich, dass auch alles wieder in der Tabelle angezeigt wird. also schließe ich mit
[tableView reloadData];
Das bewirkt leider GAR NICHTS. Es bleiben einfach nur die 3 Personen in der Tabelle stehen, obwohl ich im Debugger genau sehen kann, dass die Objectahl im Array steigt.
Kann mir jemand sagen, was ich machen muss, reloadData funktioniert?? :-c:-c:-c
Danke im Voraus
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Da Du mit einem ArrayController arbeitest, vermute ich, Du hast die Tabellenspalten mit Bindings an den ArrayController gebunden. Der aktuelle Inhalt des Arrays wird also vom ArrayController über Key-Value-Observing beobachtet.

In diesem Fall ist "reloadData" der falsche Weg. Diese Methode würde man benutzen, wenn man ohne ArrayController und Bindings arbeitet, sondern die Tabelle mit einem Tabellen-Delegate auf dem neuesten Stand hält. Wird dagegen KVO verwendet, soll ja die Oberfläche immer "live und automatisch" den Inhalt des Array widerspiegeln.

Die Lösung: Du musst das neue Array-Element auf eine KVO-kompatible Weise hinzufügen, damit der ArrayController die Änderung "sehen" kann. Statt [myArray addObject: newPerson] kannst Du zum Beispiel [[self mutableArrayValueForKey: @"myArray"] addObject: newPerson] aufrufen.

Du fügst also das neue Element nicht direkt in das echte Array, sondern in das KVO-Proxy-Array (was indirekt dann aber auch das Original-Array ändert).
 

Muly

Jonagold
Registriert
17.11.08
Beiträge
19
Ok, ich hab die Lösung:

[self willChangeValueForKey:@"employees"];

[employees addObject:[[Person alloc]init]];

[self didChangeValueForKey:@"employees"];

Danke, für die Hilfe