问题标签 [nsarraycontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1497 浏览

cocoa - 如何使用 Core Data 和抽象实体创建主从接口?

Apple 有一个很好的小教程,用于制作简单的主从界面。Interface Builder 甚至会自动从 Core Data 实体为您生成一个。但是,我正在尝试做一些比简单示例更复杂的事情,并且我一直在努力让它发挥作用。

我有一个基于核心数据文档的应用程序。该模型包括一个抽象实体 Page,以及 Page 的几个具体子实体。所有页面都有一些共同的属性(例如“名称”),并且这些属性在 Page.xml 中定义。显然,子实体具有它们独有的属性。

我希望界面允许用户在主列表(NSTableView)中查看所有类型的页面。当他们选择一个页面时,显示的详细信息字段将取决于它是什么类型的页面。

这是我现在拥有的:

我有一个主 nib 文件,其中显示了主列表,以及页面共有的所有字段。每种页面类型都有一个带有特定字段的 nib。主 nib 文件中有主 NSArrayController,用于填充 NSTableView。每个页面特定的 nib 中都有一个 NSArrayController ,这样我就可以将详细信息字段绑定到当前选择的属性。我所有的 NSArrayController 都配置相同,并且我将它们都绑定到相同的 managedObjectContext 和相同的 selectionIndexes。

我正在使用 Aaron Hillegass 的视图交换方法,他在他的 Cocoa 书中描述了这种方法。于是我注册了NSTableViewSelectionDidChangeNotifications,当我收到一个时,它会调用一个方法switchView:

switchView 查看当前选中的对象,检查它是哪种类型的 Page,并根据 Hillegass 的方法在适当的 nib 文件中交换。

如果我只添加一种类型的页面,一切正常,但是一旦我添加第二种类型的页面,我就会收到此错误:

对象的键路径选择索引值设置错误(来自绑定对象实体:页,选定对象数:1):[ valueForUndefinedKey:]:实体 NoColPage 与键侧的键值编码不兼容。

错误的最后一部分是有道理的:它试图显示错误的笔尖,因此它试图绑定到该对象不存在的字段。

我在 MyDocument 中添加了一个 selectionIndexes 字段,以便我所有的 NSArrayControllers 都可以绑定到同一个地方。我为此苦恼了好几天,也想不通。有任何想法吗?

如果有帮助,这里有一个示例项目,您可以下载。我只从我的项目中提取与这个问题相关的东西到一个新的虚拟应用程序中,我一直在用它来测试和玩耍。

PS:Interface Builder 用于从 Core Data 实体生成主从接口的工具不像我希望的抽象实体那样工作。它只为超实体中的属性创建字段。

编辑:我认为约书亚正在做某事,但不幸的是,它不起作用——我一直遇到同样的问题。起初我很难过,因为我不明白 -unbind: 需要一个字符串常量,而不是一个关键路径。

我尝试了几种变体:我跟踪当前显示的 nib 的阵列控制器;我在其中跟踪当前显示的页面类型,并且仅在尝试显示不同的页面类型时取消绑定/重新绑定...

这是代码的相关部分。

}

0 投票
3 回答
4474 浏览

cocoa - NSArrayController 初始化

我无法让支持核心数据的 NSArrayController 在我的代码中正常工作。下面是我的代码:

当我尝试调用 setSelectionIndex: 时,它返回 YES,表示选择已成功更改。但是,任何后续对 pageArrayController 对象的 getSelectionIndex 调用都会返回 NSNotFound。

我不明白的是,如果我将 NSArrayController 放入 NIB,并允许 NIB 文件执行初始化(在 Interface Builder 中具有所有相同的属性),则 NSArrayController 可以正常工作。

为什么行为上有差异?NIB 文件是否以特殊方式初始化这些类型的对象?我对 NSArrayController 的初始化不正确吗?

任何帮助表示赞赏。谢谢。

0 投票
2 回答
564 浏览

core-data - 从 NSArraycontroller 中移除的对象在被点击之前一直保留在表格中

我有一个 NSArraycontroller,它绑定到我的应用程序的 AppDelegate 的 managedObjectContext。它充当下载队列。项目以编程方式添加到 NSArraycontroller

我有一个表,其中显示了其中的两个字段,每个字段的值单独绑定到所述 NSArraycontroller。当开始新的下载时,它会以编程方式从 NSArraycontroller 中删除。

我添加了一个按钮,用于在开始之前从队列中删除下载,该按钮绑定到 NSArraycontroller 的 remove: 操作,该操作应该删除表中的选定项目。

我的问题是,当单击删除按钮时,所选项目不会从表中删除,它会一直保留在那里,直到单击表中的另一个条目。选择项目所在的行会导致在按住鼠标按钮的同时将其选中,就好像它仍然存在,但没有值一样。

在控制台中单击删除按钮时会出现以下内容: -[NSCFDictionary _setUnprocessedDeletion__:]: unrecognized selector sent to instance 0x2000f2220

如果我使用它以编程方式从表中删除项目 [[downloadsArray content] removeObjectAtIndex:0]; [downloadsTable reloadData]; [downloadsTable deselectAll:nil]; 似乎工作正常,除了我仍然得到可以选择的不可见项目,并且只有在鼠标按钮按下时才保持选中状态。

我已将删除按钮的 enabled 属性绑定到 NSArraycontroller 的 canRemove ,这可以正常工作。

我有一个显示队列中项目数的标签,它绑定到 NSArraycontroller、arrangedObjects、@count。这在添加项目时正常工作,但在删除项目时不能正常工作。

任何关于我做错了什么的想法都将不胜感激。

0 投票
1 回答
251 浏览

cocoa - 如何响应添加到 NSArrayController 内容的项目执行操作?

我有一个NSArrayController其内容是servers我的 AppDelegate 的“”属性。

我有一个NSTextField绑定到 的“ selection.name”属性的NSArrayController按钮,add:并且remove:NSArrayController.

我希望看到的是,当我单击“添加”按钮时,它NSTextField会成为第一响应者,以便用户可以立即编辑服务器的名称。

我目前的策略是观察 " arrangedObjects" 的属性,NSArrayController但我从中得到的NSKeyValueChangeKindKey只是NSKeyValueChangeSetting枚举。我希望得到这个NSKeyValueChangeInsertion值,这样我就可以要求文本字段成为第一响应者。

我的问题是,我是否以正确的方式进行此操作,还是有更常见的方法来完成此操作?我很好地连接绑定,我只是在努力解决如何将我自己的行为插入到裂缝中。

0 投票
1 回答
272 浏览

memory-management - 核心数据和自定义 NSCell

我正在使用两个实体Log(属性textdate)的核心数据构建一个玩具应用程序,并具有从toTag的多对多tags关系。LogTag

我想在表格中显示日志,所以我:

  • 在 IB 中创建了一个NSArrayController实例,LogController实体设置为Log( pic )
  • 创建了一列NSTableView,其列绑定到LogController. 图片
  • LogController我的应用程序委托 ( AppDelegate) 中使用IBOutlet. AppDelegate也有managedObjectContext
  • 创建了一个具有属性的自定义NSCell类,并且我将其绘制到单元格上NSStringmainTexttagsText
  • AppDelegate我在方法中设置了上述两个单元格属性- (void)tableView: willDisplayCell: forTableColumn: row:。(MainController也是表的代表)。对于tagsText我获取当前日志的标签并将它们连接成一个NSString

一切正常,除了:当我用鼠标选择显示多个标签的行时,应用程序崩溃并带有EXC_BAD_ACCESS. 那是我唯一一次有任何错误,但我不知道是什么原因造成的。

0 投票
2 回答
2012 浏览

cocoa - 绑定 - 主从数组控制器

我真的希望有人能在这方面提供帮助,因为我正在学习可可并且遇到了障碍。

我正在尝试模拟一个简单的扑克锦标赛。目前,我的实体只是一个锦标赛(带有数字)和一个玩家(带有名称)。锦标赛有一系列玩家。

我可以绑定两个独立的表格视图来显示比赛和球员就好了。但我希望玩家表视图仅显示属于第一个表视图中所选锦标赛的玩家。

每个都有自己的阵列控制器。我为第二个(玩家)表尝试了各种不同的绑定,但无济于事。有没有人做到这一点?如果是这样,也许您可​​以为我拼写出来,因为我在网上几乎没有示例。

  • 更新我现在几乎可以到达我需要的地方,主要是通过错误和数小时的谷歌搜索。我已将玩家 AC 的内容绑定到锦标赛 AC,控制器键为“选定对象”和模型键路径“玩家”,这是我的锦标赛实体中的数组名称。

我将播放器表视图中的列绑定到第二个播放器 AC,控制器键排列对象。但是在模型密钥路径中放什么?我知道这是有效的,因为如果我将@count 粘贴在那里,我会为所选锦标赛获得正确数量的玩家。但是 'name' 和 'player.name' 不好。有没有我可以尝试的“item.name”或“players.item.name”?

太接近了,感谢到目前为止的帮助: 替代文字

0 投票
1 回答
1227 浏览

cocoa - 表视图未根据绑定更新 - 第二部分

标题从这个问题借来,这个不是重复的。请参阅我的回答,了解该提问者的问题;我是那个答案的作者,我的问题不是那个。

我有一个包含三列的表视图,其值绑定绑定到arrangedObjects数组控制器的三个属性。数组控制器contentArray绑定到visitationResults我的文档对象;该数组中的项目是模型类 (VisitationResult) 的实例。我还将数组控制器的selectionIndexes和绑定sortDescriptors到我的文档的属性。

我正在通过几个访问器改变我的属性:

NSLog语句运行,并确认数组控制器正在收集和排列我的模型对象。这意味着我正在检查我的财产并获得我的文档的 KVO 通知(这证明了前面提问者的问题,即绕过财产的问题,不是我遇到的问题)。

我在模型对象类的访问器方法中添加了NSLog语句。其中一个被数组控制器调用,以便对对象进行排序(该属性是排序键)。另外两个,阵列控制器不知道,永远不会被调用。

因此,我的表格视图保持空白。

0 投票
1 回答
202 浏览

objective-c - 使用数组控制器来限制一个弹出窗口中的视图,具体取决于另一个弹出窗口中的选择。不基于核心数据

我正在开发一个不基于核心数据的应用程序 - 数据馈送是一系列 Web 服务。

从数据馈送中创建了两个数组。第一个保存季节数据,每个数组对象都是一个 NSDictionary。两个 NSDictionary 条目保存要在弹出窗口中显示的数据 ('seasonName') 和一个 id ('seasonID'),它充当为该季节定义的匹配项的指针(在外部表中)。

第二个数组也是 NSDictionaries 的集合。其中两个条目包含要在弹出窗口中显示的数据 ('matchDescription') 和指向第一个数组中 NSDictionaries 中定义的 seasonId 的 id ('matchSeasonId')。

我有两个 NSPopUp。我希望第一个显示季节名称,第二个显示为该季节定义的匹配项,具体取决于第一个中的选择。

我是绑定新手,所以如果我错过了一些明显的东西,请原谅。我尝试使用 ArrayControllers 如下:

SeasonsArrayController:内容绑定到appDelegate seasonsPopUpArrayData。

seasonsPopup:绑定到 SeasonsArrayController.arrangedObjects 的内容;绑定到 SeasonsArrayController.arrangedObjects.seasonName 的内容值

我看到季节名称很好。我显然可以按照类似的路线查看比赛,但我会看到所有比赛,而不是将列表限制在突出显示的赛季的比赛中。

我能找到的所有教程似乎都围绕核心数据并利用其中定义的关系。我这里没有那种奢侈。非常感激地收到任何帮助。

0 投票
3 回答
3391 浏览

cocoa - 在绑定到 NSArrayController 的 NSTableView 中显示行索引

我有一个绑定到 NSArrayController 的 NSTableView。我想让其中一个表格列显示表格行的索引。当您自己实现 NSTableDataSource 时,这很容易做到,但我无法通过绑定表视图来解决。我想我在这里寻找类似@count 键路径的东西,它给了我排列对象的计数(即@index),但这显然是缺失的。

两个澄清:

  1. 每行显示的索引是该行的索引,与数据在模型或数组控制器中的实际排列方式完全无关。例如,如果整个数据是 10000 个项目,那么索引应该从 1 到 10000,如果用户输入搜索词并且表格只显示 4 个项目,那么数字应该从 1 到 4,即使显示的项目实际上来自整个原始数组。
  2. 我需要这个,因为客户要求我这样做:-)。客户端需要一种能够估计某行之前或之后的行数的方法。您好,例如,您可能想知道添加了多少行。
0 投票
3 回答
1233 浏览

cocoa - NSArrayController addObject 返回 null

我有一个带有两个 NIB 的核心数据应用程序,一个带有一对 NSTableView 的主窗口和一个用于添加内容的表单。该表单有一个 NSTextView 和一个 NSTextField。我在核心数据中有两个实体,并使用两个 NSArrayControllers 管理内容。使用一个 NSArrayController,我的 AppDelegate 中的以下代码可以很好地添加内容:

但是,我的 AppController 类中的这段代码总是返回 null:

似乎 chapterArrayController 没有连接到核心数据中的 Chapter 实体,但 IB 中的绑定是正确的。我认为这与多个笔尖有关,但我在这里有点不知所措。

任何指向正确方向的指针都值得赞赏。

谢谢。

更新 2:我创建了一个名为 JBAddChapter 的类,如下所示:

JBAddChapter.h

JBAddChapter.m

我在主窗口的 IB 中创建了两个按钮,并将一个连接到上面的 testArrayControllers IBAction。我连接到 AppController 和这个 IBAction 的另一个按钮:

如果我standAloneTestArrayControllers从 JBAddChapter 的 IBAction 调用,一切正常。如果我使用 JBAddChapter 中的工厂方法从 AppController 调用相同的方法,则数组控制器为零。

那么,为什么数组控制器会从一种方法返回 nil 而不是另一种呢?据我所知,IB 中的所有绑定都是正确的。