2009-08-26 30 views
0

Dies ist eine sehr neue Frage, und das ist etwas, was ich schon oft gemacht habe, aber es gibt etwas, das ich diesmal vermisse.Tabellenansicht wird nicht nach Bindungen aktualisiert

In meiner AppDelegate.h Datei ich eine NSArray erklären und sie als Eigenschaft:

@interface AppDelegate : NSObject { 
NSArray *lines; 

} 

@property(readwrite, retain) NSArray *lines; 
@end 

Und dann in der AppDelegate.m Datei im awakeFromNib Methode, die ich Alloc es:

lines = [[NSArray alloc] init]; 

Dann habe ich eine Methode, die den Zeilen-Array setzt:

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL]; 
lines = [fileContents componentsSeparatedByString:@"\n"]; 

ich habe einen Array-Controller das ist gebundenes zu dann habe ich eine Tabellenspalte an Array Controller.arrangedObjects gebunden. Ich kann bestätigen, dass das Array aktualisiert wird (getestet mit NSLog), aber der Inhalt der Tabelle wird nicht aktualisiert (es bleibt leer).

Gibt es etwas Offensichtliches, das ich hier vermisse?

+0

Tun Sie nicht 'Fehler: NULL'. Es gibt eine Reihe von Dingen, die in dieser Aussage schief gehen können, und du willst nicht wissen, was passiert ist. –

Antwort

4

Sie benötigen keine Datenquelle, wenn Sie Bindings verwenden. Das Eine oder das Andere.

I have an array controller thats bound to "AppDelegate.self.lines" …

Warum self?

@property(readwrite, retain) NSArray *lines;

Nein, verwenden Sie copy hier. Andernfalls werden Sie feststellen, dass Sie das änderbare Array einer anderen Person behalten, die dann mutiert. Dann wird sich "Ihr" Array geändert haben, ohne dass Sie es wissen.

Then I have a method that sets the lines array:

lines = [fileContents componentsSeparatedByString:@"\n"]; 

Aus diesem Grund zeigt die Tabelle nichts. Sie gehen nicht durch die Eigenschaft, Sie greifen direkt auf die Instanzvariable zu. Direkte Instanzvariablenzugriffe verursachen keine KVO-Benachrichtigungen, so dass der Array-Controller die Änderung nie erkennt.

Noch schlimmer, Sie lecken das alte Array (da Sie einfach über zuweisen, ohne es zu veröffentlichen) und dieses neue Array zu unter behalten. Da Sie das neue Array nicht beibehalten, wird diese Instanzvariable in Kürze ein totes Objekt enthalten. Die automatische Speicherung erfolgt über die Methode setLines:, die nur beim Aufruf aufgerufen wird.

Sie müssen sich durch die Eigenschaft gehen:

self.lines = [fileContents componentsSeparatedByString:@"\n"]; 

Eine Eigenschaft Zugang ist eine implizite Zugriffs Nachricht, so dass diese behält sowohl das Array (oder kopiert, sobald Sie die @property korrigieren, wie ich oben vorgeschlagen) und postet KVO-Benachrichtigungen.

+0

Danke eine Tonne Peter, das hat perfekt funktioniert :) – indragie

2

Wenn Sie sagen, dass Sie ein arrangedObjects an die Spalte gebunden haben, meinen Sie, dass Sie die tablview-Datenquelle festlegen? Wenn Sie die Datenquelle tableview nicht auf das Array Zeilen setzen müssen

+0

OK, ich habe einen Array Controller, dessen Content Array auf AppDelegate.self.lines gesetzt ist. Dann binde ich die arrangedObjects des Array Controllers an die Tabellenspalte. Ich habe keine Datenquelle für t gesetzt, muss ich? – indragie

+0

ennuikiller: Bindungen sind eine Alternative zu Datenquellen. –

0

Vielleicht möchten Sie read through this, es hat ein paar gute Diagramme und Erklärungen. Was ennuikiller sagt, ist korrekt, ich denke, es ist ein Problem mit Ihrer Datenquelle. Dies geschieht durch Aufruf

[aTable setDelegate:aDelegate]; 
+0

Ich habe versucht, die Datenquelle/den Delegaten sowohl auf den Hauptanwendungsdelegierten als auch auf den Array-Controller einzustellen. – indragie

Verwandte Themen