gpt4 book ai didi

macos - 我应该如何从 NSArrayController 控制的 NSTableView 中删除所有项目?

转载 作者:行者123 更新时间:2023-12-03 16:06:55 24 4
gpt4 key购买 nike

我正在使用 NSArrayControllerNSMutableArrayNSTableView 来显示我自己的自定义对象的列表(尽管这个问题可能适用于以下情况)您也只是显示了普通 NSString 对象的列表)。

在不同的时间点,我需要清除数组并刷新数据源中的数据。但是,仅在我的 NSMutableArray 对象上调用 removeAllObjects 不会触发 KVO 更新,因此屏幕上的列表保持不变。

NSArrayController 没有可用的 removeAllObjects 方法,这看起来很奇怪。 (它确实有 addObject,我用它来添加对象,确保触发 KVO 并更新 UI。)

我设法使这种情况正确发生的最干净的方法是:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

...所以我必须自己手动执行 KVO 通知(这是在我的测试应用程序类中,其中包含 myArray 属性,即 NSMutableArray,如前所述。)

这似乎是错误的 - 有更好的方法吗?从我的谷歌搜索来看,似乎有些人对 NSArrayController 中缺少 removeAllObjects 感到困惑,但还没有看到任何更好的解决方案。

我见过这个解决方案:

[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];

但这对我来说看起来更不愉快。至少我的解决方案至少在某种程度上是 self 记录的。

Apple 没有注意到有时人们可能想要清空通过 NSArrayController 对象管理的列表控件吗?这似乎很明显,所以我想我一定错过了一些东西......

旁白:当然,如果我向数组添加新项目(通过 NSArrayController),那么这会触发 NSArrayController/NSTableView 的 KVO 更新,但是:

  1. 有时我不会在列表中放入任何项目,因为没有。所以你只能看到旧的项目。
  2. 无论如何,这有点令人讨厌。

最佳答案

您不能从 TableView 中删除项目。它没有任何项目——它只是显示另一个对象的项目。

如果您将数组 Controller 的内容数组绑定(bind)绑定(bind)到某个其他对象的数组属性,那么您应该使用该对象的该属性。使用[[object mutableArrayValueForKey:@"property"]removeAllObjects]

另一方面,如果您尚未绑定(bind)数组 Controller 的内容数组绑定(bind),则需要直接与其内容进行交互。使用[[arrayController mutableArrayValueForKey:@"content"]removeAllObjects]。 (您也可以使用 arrangedObjects 而不是 content。如果一个不起作用,请尝试另一个 - 我只用过第一种方法,绑定(bind)数组 Controller 到其他东西。)

关于macos - 我应该如何从 NSArrayController 控制的 NSTableView 中删除所有项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646787/

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