将 NSTableView 绑定到 NSArrayController,而不是直接从模型数组中获取数据

发布于 2025-01-03 03:43:43 字数 1035 浏览 1 评论 0原文

当前情况:直接绑定

我有一个 NSTableView,它显示来自我的自定义对象的 NSArray 的数据。

所需的方法:数组控制器

但是,使用 NSArrayController 作为我的任意模型对象的外观将是“更好的实践”。

因此,我在应用程序中复制了该表,并创建了一个新的 NSViewController,其中将 NSTableViewTable Content 绑定到 NSArrayController< /代码>。我为此类添加了一个 IBOutlet ,因此我现在可以像这样设置我的视图控制器:

ContactListViewController *myVC = [[ContactListViewController alloc] init];

// Tell the ArrayController where the content-array is.
myVC.contactsArrayController.content = self.myModel.contactsArray;

现在,由于我将表视图的 Table Content 绑定到数组控制器,我将预计,一旦我用数据(来自远程服务)填充数组,表视图就会更新,这就是我直接绑定到 myModel.contactsArray 的其他方法的情况。

问题:没有数据

但是,表仍然是空的。我是否必须设置其他东西才能使其工作(也许是一些 willChangeValueForKey-magic 或其他我错过的东西。我已经尝试将数组控制器设置为 dataSource 并且NSTableViewdelegate 但这似乎也不起作用(无论如何,我不清楚 dataSourceTable 如何工作内容绑定“相关彼此”)。

Current Situation: Direct Binding

I have an NSTableView which displays the data that comes from an NSArray of my custom objects.

Desired Approach: Array Controller

However, It would be "more best practise" to use an NSArrayController instead as a facade to my arbritary model object.

So I duplicated the table in my application and created a new NSViewController where I bound the Table Content of the NSTableView to the NSArrayController. I added an IBOutlet for this class so I can now setup my View Controller like this:

ContactListViewController *myVC = [[ContactListViewController alloc] init];

// Tell the ArrayController where the content-array is.
myVC.contactsArrayController.content = self.myModel.contactsArray;

Now since I bound the Table Content of the table view to the array controller, I would expect, that as soon as I fill the array with data (from a remote service) that the tableview is updated, which is the case for my other approach where I bind to myModel.contactsArray directly.

The Problem: No data

However, the table remains empty. Do I have to setup something else for this to work (Maybe some willChangeValueForKey-magic or something else I have missed. I already tried to set the array controller as the dataSource and the delegate of the NSTableView but that did not seem to work either (Anyway it is not clear to me how dataSource and the Table Content binding "relate to each other").

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏尔 2025-01-10 03:43:43

当您用内容填充数组时,您是重新分配不可变数组还是附加到可变数组?不管怎样,它都不会像你期望的那样工作。

当您以这种方式设置数组控制器的内容时​​,数组控制器只是复制内容,而不是保留引用。无论它是可变数组(还是重新分配模型的contactsArray),后续更改都不会产生任何影响。

相反:

  1. 插入内容时

    在数组控制器上调用-add:。这可能对您的情况没有帮助。

  2. 如果您使用不可变数组,您可以将数组控制器绑定myModelcontactsArray键,而不是分配它。

  3. 如果您使用可变数组,我认为这不起作用。您可以在模型中创建第二个数组控制器,并将视图的数组控制器绑定到 contactsArrayController.arrangedObjects。也许有更好的方法,但这就是我过去所做的。

When you fill up your array with content, are you re-assigning an immutable array or appending to a mutable array? Either way, it won't work quite how you're expecting.

When you set the content of an array controller this way, instead of keeping a reference, the array controller just copies the content. Subsequent changes will have no effect, whether it's a mutable array (nor if you reassign the model's contactsArray).

Instead:

  1. Call -add:on the array controller when you insert content. That probably that won't help in your case.

  2. If you use immutable arrays you could bind the array controller to myModel's contactsArray key instead of assigning it.

  3. If you use a mutable array I don't think that will work. You could create a second array controller in the model and bound the view's array controller to contactsArrayController.arrangedObjects. Maybe there's a better way, but that's what I've done in the past.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文