gpt4 book ai didi

cocoa - 如何使用核心数据和抽象实体创建主从接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 16:45:00 25 4
gpt4 key购买 nike

Apple 有一个很棒的小教程,用于制作简单的主从界面。 Interface Builder 甚至会自动从核心数据实体为您生成一个。但是,我正在尝试做一些比简单示例更复杂的事情,并且我已经努力了一段时间才让它发挥作用。

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

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

这是我现在所拥有的:

我有一个主 nib 文件,其中显示主列表,以及页面通用的所有字段。每种页面类型都有一个 Nib 及其特定字段。主 nib 文件中有主 NSArrayController,它填充 NSTableView。每个特定于页面的 Nib 中也有一个 NSArrayController,以便我可以将详细信息字段绑定(bind)到当前选择的属性。我的所有 NSArrayController 的配置都是相同的,并且我将它们全部绑定(bind)到相同的 ManagedObjectContext 和相同的 SelectionIndexes。

我正在使用 Aaron Hillegass 在他的 Cocoa 书中描述的 View 交换方法。因此,我注册了 NSTableViewSelectionDidChangeNotifications,当我收到通知时,它会调用 switchView 方法:

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

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

Error setting value for key path selectionIndexes of object (from bound object entity: Page, number of selected objects: 1): [ valueForUndefinedKey:]: the entity NoColPage is not key value coding-compliant for the key side.

错误的最后一部分是有道理的:它在尝试显示错误的 Nib 时卡住了,因此它尝试绑定(bind)到该对象不存在的字段。

我向 MyDocument 添加了一个 SelectionIndexes 字段,以便我的所有 NSArrayController 都可以绑定(bind)到同一个位置。我为这个问题苦恼了好几天了,一直想不通。有什么想法吗?

如果有帮助,here is a sample project you can download 。我仅将与此问题相关的内容从项目中提取到一个新的虚拟应用程序中,我一直用它来测试和使用。

PS:用于从核心数据实体生成主从接口(interface)的 Interface Builder 工具无法像我希望的那样为抽象实体工作。它只为超实体中的属性创建字段。

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

我尝试了几种变体:我跟踪当前显示的 Nib 的数组 Controller ;我跟踪当前显示的页面类型,并且仅在尝试显示不同的页面类型时取消绑定(bind)/重新绑定(bind)...

这是相关的代码部分。

-(void) displayViewController: (ManagingVC *) vc withClass:(NSString*) className {

//Try to end editing
NSWindow *w = [box window];
BOOL ended = [w makeFirstResponder:w];
if (!ended) {
NSBeep();
return;
}

//The Managing View Controller's NSArrayController
NSArrayController* vcAc = [vc arrCont];

//if the page we're trying to switch to is NOT the same type as the current page we're displaying
//if it is, do nothing.
if (![currPageDisplayed isEqual:className]) {

//unbind the old view controller
ManagingVC *oldvc = [viewControllers objectForKey:className];
NSArrayController* oldsac = [oldvc arrCont];
[oldsac unbind:@"selectionIndexes"];

//bind the new view controller
[vcAc bind:@"selectionIndexes" toObject:self withKeyPath:@"selectionIndexes" options:nil];
currPageDisplayed = className;

NSView *v = [vc view];

//display the new view in an NSBox in the main nib
[box setContentView:v];
}

}

最佳答案

问题是您将 Nib 的数组 Controller 绑定(bind)到文档的选择,这导致它们尝试(当选择更改时)代表所选项目。

试试这个:

  1. 取下 Nib 上的固定器。
  2. 在添加新 View 之前,请在代码中连接其绑定(bind)。
  3. 在删除旧 View 之前,请在代码中断开其绑定(bind)。

这应该让一切都愉快。

关于cocoa - 如何使用核心数据和抽象实体创建主从接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1811454/

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