【问题标题】:How to refresh an NSTableVIew when you populate the NSMutableArray (bind) associated with it填充与之关联的 NSMutableArray(绑定)时如何刷新 NSTableVIew
【发布时间】:2011-05-02 06:33:36
【问题描述】:

我尝试将我的NSArraycontroller 绑定到NSMutableArray;该数组包含“iData”类型的对象(它是一个自定义类)。该类还包含一些NSMutableString 变量,这些变量被设置为KVC 的键。然后我将我的NSTableColumn 绑定到NSArrayController 并分别设置每一列的关键模型路径。

当我尝试填充数组时,GUI 不显示任何内容。我忘记了什么?

【问题讨论】:

  • 如何填充阵列? .如果您不是通过 arrayController 填充数组,那么您将不会获得自动更新。
  • 我正在通过 NSMutableArray 填充数组,但我不确定如何通过 NSArrayController 填充数组,因为我的 Controller.m 类中没有该实例。请告诉我如何解决这个问题。
  • 我已将 NSController 实例拖到我的 mainmenu.nib 托盘中。我是否需要在我的 Controller.h 文件中声明一个 IBOutLet NSArrayController,然后将它与托盘中的 NSArrayController 实例连接起来?

标签: objective-c cocoa-bindings nstableview nsarraycontroller nstablecolumn


【解决方案1】:

所以很可能你很久以前就解决了这个问题,但万一其他人偶然发现了这个问题......

我正在通过NSMutableArray 填充数组,但我不确定如何通过NSArrayController 填充数组,因为我的Controller.m 类中没有该实例。请告诉我如何解决这个问题。

你可能正在做类似的事情

[myData addObject:someObject];

但是,您的 NSArrayController 不会获悉对 NSMutableArray 实例的此更改,因为 addObject 不兼容 KVC。您需要通知任何观察到您的 NSMutableArray 实例已更改的对象。至少有两种方法可以做到这一点。假设您的 NSMutableArray 实例属性名为“myData”,那么您可以执行以下操作:

[self.willChangeValueForKey:@"myData"];
[myData addObject:someObject];
[self.didChangeValueForKey:@"myData"];

NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"myData"];
[bindingsCompliantArray addObject:someObject];

Another SO answer(已链接)对 mutableArrayValueForKey 的实际作用有很好的解释,但我建议阅读有关键值编码和键值观察的 Apple 开发人员文档以帮助理解它。

我已将 NSController 实例拖到我的 mainmenu.nib 托盘中。我是否需要在我的 Controller.h 文件中声明一个 IBOutLet NSArrayController,然后将它与托盘中的 NSArrayController 实例连接起来?

您的 nib 文件中需要一个 NSArrayController 实例,但对于您在此处描述的情况,您的界面中不需要一个 IBOutlet。 NSArrayController 应该绑定到 NSMutableArray 的键(在我的示例中为 myData),听起来您已经正确绑定了表列。

【讨论】:

  • 在提出的 2 种方法中,只有第一种对我有用。我的 appDelegate 拥有一个容器对象 A ,它拥有项目 B 的(强)NSMutableArray。在我的 .xib 中,NSArrayCntroller 的 contentArray 绑定到 AppDelegate 的“A.B”。现在我向 A 添加了另一个属性 C 分配的 C = [self mutableArrayValueForKey:@"B"];现在我将 xib 中的绑定路径更改为“A.C”,但没有任何效果。对“C”的更改不会影响 UI。在调试器中,我验证了“B”和“C”都有项目,如果我手动调用我的 ArrayControllers“rearrangeObjects”,它确实会显示它们,所以绑定可能被破坏了
【解决方案2】:

虽然Stephen's 的答案可能是“要走的路”,但我认为OP 的原始问题“如何使用NSArrayController 插入/删除/管理我的NSMutableArray,值得一个更简单和更直接的答案:

NSArrayController 提供了一套完整而丰富的方法,甚至是 IBActions 来满足您在托管 NSMutableArray 上想要的几乎任何东西,并具有“通过过滤器”、通过选择和“保持排序规则”处理事物的所有细节 例如插入一个新项目,以便根据当前的排序描述插入它。

这里是这些方法的摘录(打开NSArrayController.h 以获得完整集)并记住'content'是你的NSMutableArray,而'arrangedObjects'是NSArrayController提供的一个数组,它对内容进行过滤和排序, “正在路上”显示在 NSTableView 中。

- (BOOL)addSelectedObjects:(NSArray *)objects;
- (BOOL)removeSelectedObjects:(NSArray *)objects;

- (IBAction)add:(nullable id)sender;    // overridden to add a new object to the content objects and to the arranged objects
- (IBAction)remove:(nullable id)sender;    // overridden to remove the selected objects
- (IBAction)insert:(nullable id)sender;

- (void)addObject:(id)object;    // overridden to add to the content objects and to the arranged objects if all filters currently applied are matched
- (void)addObjects:(NSArray *)objects;
- (void)insertObject:(id)object atArrangedObjectIndex:(NSUInteger)index;    // inserts into the content objects and the arranged objects (as specified by index in the arranged objects) - will raise an exception if the object does not match all filters currently applied
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObjectAtArrangedObjectIndex:(NSUInteger)index;    // removes from the content objects and the arranged objects (as specified by index in the arranged objects)
- (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObject:(id)object;    // removes from the content objects and the arranged objects (if currently contained)
- (void)removeObjects:(NSArray *)objects;

当然,所有这些都是为了对内容进行直接编程控制,而不是通过 Cocoa-Bindings “自动”控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多