0

这是一个非常新手的问题,这是我以前做过很多次的事情,但是这次我错过了一些东西。

在我的 AppDelegate.h 文件中,我声明了一个 NSArray 并将其设置为属性:

@interface AppDelegate : NSObject {
NSArray *lines;

}

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

然后在 awakeFromNib 方法的 AppDelegate.m 文件中分配它:

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 测试)但是表的内容没有被更新(它保持空白)。

我在这里有什么明显的遗漏吗?

4

3 回答 3

4

如果您使用绑定,则不需要数据源。非此即彼。

我有一个绑定到“AppDelegate.self.lines”的数组控制器……</p>

为什么self

@property(readwrite, retain) NSArray *lines;

不,copy在这里使用。否则,您会发现自己保留了其他人的可变数组,然后他们将对其进行变异。然后“你的”数组会在你不知情的情况下发生变化。

然后我有一个设置行数组的方法:

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

这就是表格没有显示任何内容的原因。您没有通过属性,而是直接访问实例变量。直接实例变量访问不会导致 KVO 通知,因此数组控制器永远不会发现更改。

更糟糕的是,您正在泄漏旧数组(因为您只是简单地分配它而不释放它)并保留这个新数组。因为您没有保留新数组,所以该实例变量将很快保存一个死对象。自动保留是由setLines:方法完成的,只有在你调用它时才会被调用。

您需要通过该属性:

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

属性访问是一个隐式访问器消息,因此它既保留数组(或复制它,一旦您@property按照我上面的建议进行更正)并发布 KVO 通知。

于 2009-08-26T20:02:51.330 回答
2

当你说你有一个绑定到列的排列对象时,你的意思是你设置了 tablview 数据源吗?如果不是,您将 tableview 数据源设置为 lines 数组

于 2009-08-26T18:08:35.367 回答
0

你可能想通读这个,它有一些很好的图表和解释。ennukiller 说的是正确的,我认为这是您的数据源的问题。这是通过调用

[aTable setDelegate:aDelegate];
于 2009-08-26T18:14:48.223 回答