2009-08-26 105 views
0

這是一個非常新手的問題,這是我以前做過很多次的事情,但這次我錯過了一些東西。表視圖不會根據綁定更新

在我AppDelegate.h文件我聲明一個NSArray並將其設置爲一個屬性:

@interface AppDelegate : NSObject { 
NSArray *lines; 

} 

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

然後在awakeFromNib方法AppDelegate.m文件我的Alloc它:

lines = [[NSArray alloc] init]; 

然後,我有用於設置線陣列的方法:

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

我有一個陣列控制器那界到AppDelegate.self.lines然後我有一個表列綁定到Array Controller.arrangedObjects。我可以確認數組正在更新(使用NSLog進行測試),但是表中的內容沒有被更新(它仍然是空白的)。

有什麼明顯的我在這裏失蹤?

+0

不要做'錯誤:NULL'。在這個陳述中有很多事情可能會出錯,而你不知道發生了哪一件事。 – 2009-08-26 20:18:01

回答

4

如果您使用綁定,則不需要數據源。非此即彼。

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

爲什麼self

@property(readwrite, retain) NSArray *lines;

不,請使用copy這裏。否則,你會發現自己保留了別人的可變數組,然後他們會變異。然後,「你的」陣列將在你不知情的情況下發生變化。

Then I have a method that sets the lines array:

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

這就是爲什麼表不顯示任何內容。你不通過屬性,你直接訪問實例變量。直接實例變量訪問不會導致KVO通知,所以數組控制器永遠不會發現有關更改。

更糟糕的是,您正在泄漏舊數組(因爲您只是簡單地指定而不釋放它),並且保留這​​個新數組。因爲你沒有保留新的數組,那麼這個實例變量很快就會保存一個死對象。自動保留由setLines:方法完成,只有在您調用它時纔會調用該方法。

你需要去通過屬性:

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

屬性訪問是一個隱含的訪問消息,所以這兩個保留陣列(或拷貝它,一旦你糾正@property正如我上面提出的建議)和張貼KVO通知。

+0

謝謝噸彼得,完美的工作:) – indragie 2009-08-26 23:13:17

2

當你說你有一個與這個列綁定的orderedObjects,你的意思是你設置了tablview數據源?如果不是你將tableview數據源設置爲行數組

+0

好的,我有一個數組控制器,其內容數組設置爲AppDelegate.self.lines。然後我將陣列控制器的orderedObjects綁定到表格列。我沒有爲t設置數據源,我需要嗎? – indragie 2009-08-26 18:15:43

+0

ennuikiller:綁定是數據源的替代方案。 – 2009-08-26 19:55:19

0

你可能想要read through this,它有一些很好的圖表和解釋。 ennuikiller所說的是正確的,我認爲這是你的數據源的問題。這通過致電

[aTable setDelegate:aDelegate]; 
+0

我試着設置數據源/委託給主應用程序委託和數組控制器,都沒有工作。 – indragie 2009-08-26 19:05:54