表视图不根据绑定进行更新

时间:2009-08-26 17:59:21

标签: objective-c cocoa cocoa-bindings nstableview

这是一个非常新手的问题,这是我以前做过很多次的事情,但这次我有些遗漏。

在我的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测试)但是表的内容没有更新(它仍然是空白的)。

这里有什么显而易见的东西吗?

3 个答案:

答案 0 :(得分:4)

如果您正在使用Bindings,则不需要数据源。一个或另一个。

  

我有一个绑定到“AppDelegate.self.lines”...

的数组控制器

为什么self

  

@property(readwrite,retain)NSArray * lines;

不,请在此处使用copy。否则,你会发现自己保留了别人的可变数组,然后他们就会变异。然后,“你的”数组将在你不知情的情况下发生变化。

  

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

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

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

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

您需要通过该物业:

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

属性访问是一种隐式访问者消息,因此这两者都会保留数组(或者在我按照上面的建议更正@property后复制它)并发布KVO通知。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

来完成的
[aTable setDelegate:aDelegate];