这是一个非常新手的问题,这是我以前做过很多次的事情,但这次我有些遗漏。
在我的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测试)但是表的内容没有更新(它仍然是空白的)。
这里有什么显而易见的东西吗?
答案 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];