objective-c - TableView 未根据绑定(bind)更新

标签 objective-c cocoa cocoa-bindings nstableview

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

在我的 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/

相关文章:

objective-c - 将监听器添加到 leftBarButtonItem

objective-c - 用于桌面应用程序的 MacRuby+IronRuby 或 JRuby?

objective-c - 在 XCode 中更改 NSImage - 这行代码不起作用

ios - 自定义 UIView 在 addSubview 上不可见

cocoa - 如何制作一个像 Mac OS X Dock 堆栈一样的窗口?

objective-c - NSTextField commitEditing 到绑定(bind)

objective-c - 将 block 添加到非事件调度队列

swift - 在动态创建的 NSButton 复选框上获取发件人

cocoa - mutableArrayValueForKey 和调用 insertObject 之间的区别 :inEmployeesAtIndex: directly

xcode - 如何绑定(bind)1 :many relation in Interface Builder