gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:29:54 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com