这是一个非常新手的问题,这是我以前做过很多次的事情,但这次我遗漏了一些东西。
在我的 AppDelegate.h 文件中,我声明一个 NSArray 并将其设置为属性:
@interface AppDelegate : NSObject {
NSArray *lines;
}
@property(readwrite, retain) NSArray *lines;
@end
然后在 AppDelegate.m 文件中的 awakeFromNib 方法中分配它:
lines = [[NSArray alloc] init];
然后我有一个设置行数组的方法:
NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL];
lines = [fileContents componentsSeparatedByString:@"\n"];
我有一个绑定(bind)到AppDelegate.self.lines
的数组 Controller ,然后我有一个绑定(bind)到Array Controller.arrangedObjects
的表列。我可以确认数组正在更新(使用 NSLog 进行测试),但是表的内容没有更新(它保持空白)。
我在这里遗漏了一些明显的东西吗?
最佳答案
如果您使用绑定(bind),则不需要数据源。其一或彼。
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 通知,因此数组 Controller 永远不会发现更改。
更糟糕的是,您泄漏了旧数组(因为您只是对其进行了分配而不释放它)并且保留了这个新数组。因为您没有保留新数组,所以该实例变量很快就会保存一个死对象。自动保留是通过 setLines:
方法完成的,该方法仅在您调用时才会被调用。
您需要浏览该属性:
self.lines = [fileContents componentsSeparatedByString:@"\n"];
属性访问是隐式访问器消息,因此这既保留数组(或复制它,一旦您按照我上面的建议更正了 @property
)并发布 KVO 通知。
关于objective-c - TableView 未根据绑定(bind)更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1336478/