Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 将NSArrayController绑定到NSPopupButton&;NSTextField_Macos_Cocoa_Cocoa Bindings_Nsarraycontroller - Fatal编程技术网

Macos 将NSArrayController绑定到NSPopupButton&;NSTextField

Macos 将NSArrayController绑定到NSPopupButton&;NSTextField,macos,cocoa,cocoa-bindings,nsarraycontroller,Macos,Cocoa,Cocoa Bindings,Nsarraycontroller,我想要完成的似乎应该相当简单。我放置了一个示例项目 我有一个NSArrayController,里面装满了一系列NSDictionary [[self controller] addObject:@{ @"name" : @"itemA", @"part" : @"partA" }]; [[self controller] addObject:@{ @"name" : @"itemB", @"part" : @"partB" }]; [[self controller] addObject:@{

我想要完成的似乎应该相当简单。我放置了一个示例项目

我有一个NSArrayController,里面装满了一系列NSDictionary

[[self controller] addObject:@{ @"name" : @"itemA", @"part" : @"partA" }];
[[self controller] addObject:@{ @"name" : @"itemB", @"part" : @"partB" }];
[[self controller] addObject:@{ @"name" : @"itemC", @"part" : @"partC" }];
我正在使用基于“name”键的数组中的项填充NSPopupButton。这可以通过以下绑定轻松实现

然后,我想根据当前选择的NSPopupButton使用“part”键中的文本填充NSTextField。我已设置以下绑定:

仅使用这些绑定,文本字段就显示“partC”

但是,如果更改NSPOUPMENU的值,则文本字段显示的内容不会更改

我认为这只是在NSPopupButton上设置“Selected Object”绑定的问题

但这是行不通的。由于某种奇怪的原因(提供了一个额外的原因),我的菜单中出现了代理对象

那么,我需要做些什么才能使这项工作正常进行呢?

在这种情况下,不要使用“选定对象”。将弹出窗口的“选定索引”绑定到NSArrayController的
selectionIndex
Controller键。在您的示例项目上进行了试用,效果良好

编辑:

您询问了为什么在
selectedObject
上使用
selectionIndex
是合适的。首先是一些背景:

绑定弹出菜单时,有三个虚拟“集合”可以绑定:内容是抽象的“应该在菜单中的内容列表”--您必须始终指定内容。如果既不指定内容对象,也不指定内容值,则绑定到内容的值集合将用作“对象”,并且由其
-description
方法返回的字符串将用作“值”。换句话说,内容值是弹出窗口中显示的字符串,内容对象是它们对应的对象(可能不是字符串,也可能没有适合在弹出窗口中生成文本的
-description
方法)。需要注意的是,这里可能有三种不同的“虚拟数组”:用于内容的数组、用于内容对象的数组(可能不同)和用于内容值的数组(也可能不同)。它们都将具有相同数量的值,并且通常,内容对象内容值将是内容数组中相应项的函数(在数学意义上)

接下来需要注意的是,
NSArrayController
在生活中的一部分目的是跟踪用户的选择。对于弹出窗口来说,这只是轻微的(如果有的话)有趣,但是对于
NSTableView
来说,它开始变得更加有趣。在内部,
NSArrayController
通过保存一个
NSIndexSet
来跟踪这一点,其中包含在任何给定时间选择的内容数组中的索引。从那里,选择状态以几种不同的方式公开,以方便您:

  • selectionIndexes
    如所述-一个
    NSIndexSet
    包含内容数组中所选项目的索引
  • selectionIndex
    对于不支持多选的应用程序来说是一个方便的选项。可以将其视为等同于
    arrayController.SelectionIndex.firstIndex
  • selectedObject
    在单个选择情况下也很有用,在概念上对应于
    ContentObjectsArray[arrayController.SelectionIndex.firstIndex]
  • selection
    返回一个特殊对象(对使用者来说是不透明的),代理读取并写回数组控制器内容数组中的基础对象(或在多次选择的情况下的对象)。它的存在是为了在多个选择案例中一次编辑多个对象,并为其他特殊案例提供支持。(您应该将此属性视为只读属性;因为它的类型对使用者是不透明的,所以您永远无法生成合适的新值来写入它。进行如下调用是有意义的:
    -[arrayController.selection setValue:myObject forKey:@“modelKey”]
    ,但进行类似
    -[arrayController设置值:myObject forKey:@“selection”]

随着对代码< >选择< <代码>属性的理解,让我们后退一步,看看为什么在这种情况下使用它不是正确的。<代码> NSPopUpButton <代码>试图变得聪明:您已经提供了一个列表,它应该通过<<强>内容< /强>和<强>内容值<强>绑定。您还告诉它您想将其所选对象绑定到

NSArrayController
选择
属性。您可能认为这是一种“只写”绑定,即“亲爱的弹出窗口,请接受用户的选择并将其推入arrayController”,但绑定实际上是双向的。因此,当绑定刷新时,弹出窗口首先用内容/内容值绑定中的所有项目填充菜单,然后显示,"哦,你说
arrayController上的值。selection
是我的Selected对象。这很奇怪——它不在与我的内容/内容值绑定绑定的事物列表中。我最好为你将其添加到列表中!我将通过调用
-description
来实现这一点,并将该字符串插入菜单f或者你