从弹出按钮插入 Cocoa 核心数据项目关系

Posted

技术标签:

【中文标题】从弹出按钮插入 Cocoa 核心数据项目关系【英文标题】:Cocoa core data project relationship insertion from popup button 【发布时间】:2012-04-29 20:27:08 【问题描述】:

我有一个包含 2 个实体的核心数据:“CarEntity”和“PassengerEntity”。

现在,每个实体都有一个名为“名称”的属性。 CarEntity 与称为“passengers”的PassengerEntity 具有一对多关系,而PassengerEntity 具有“inCar”的反向关系。

所以,我做了这个界面来插入一个新的乘客。

我有一个用于人名的 NSTextField 和一个用于选择汽车的 NSPopUpButton。 弹出按钮有一个“内容值”绑定到一个 NSControllerArray,它允许我获取所有的汽车。

然后我有一个按钮来保存所有内容。标头代码如下:

IBOutlet NSTextField   *newPassengerNameField;
IBOutlet NSPopUpButton *newPersonCarField;

实现是这样的:

- (IBAction)saveNewPassenger:(id)sender 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    NSManagedObject *newPassengerObject = [
        NSEntityDescription
            insertNewObjectForEntityForName:@"PassengerEntity"
                     inManagedObjectContext:managedObjectContext
    ];

    //Here we have all the fields to be inserted.
    [newPassengerObject setValue:[newPassengerNameField stringValue] forKey:@"name"];

    //Car ?????


好的,这段代码工作得很好……就名字而言。但我不知道如何插入汽车关系。

我的应用程序强制用户在进入此阶段之前创建汽车,因此我在 CarEntity 中有对象。

问题是:如何获取弹出按钮的值并将其发送到此插入代码?

谢谢!

【问题讨论】:

【参考方案1】:

这非常有效,但非常感谢您在清理代码方面的任何帮助!

[newPassengerObject setValue:[newPassengerNameField stringValue] forKey:@"name"];

//Continuing from old code.

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"name = %@", [[newPersonCarField selectedItem] title]]; 

NSEntityDescription *modelEntity = [NSEntityDescription entityForName:@"CarEntity" inManagedObjectContext:managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

[fetchRequest setEntity:modelEntity];
[fetchRequest setPredicate:predicate];

NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:nil];

[fetchRequest release];

[newPassengerObject setValue:[results objectAtIndex:0] forKey:@"inCar"];
//Code goes on from here.

【讨论】:

【参考方案2】:

// 代码清理cmets

1:你为什么使用'setValue:forKey'?你没有自动生成你的实体类文件。如果您已生成,则可以将实体视为自定义对象。例如。我正在拿起你的一段代码。如果你有实体类文件,它可以像下面这样修改

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

PassengerEntity *newPassengerObject = [
    NSEntityDescription
        insertNewObjectForEntityForName:@"PassengerEntity"
                 inManagedObjectContext:managedObjectContext
];
newPassengerObject.name = [newPassengerNameField stringValue];

2:不要在 saveNewPassenger: 方法中混淆核心数据代码。它不适用于 Core Data 操作。既然如此,为什么要在那个方法里面写 COre 数据代码呢?它只会导致代码重复。最好编写一个“接口类”来与核心数据通信。这将增加模块化和代码可重用性

【讨论】:

以上是关于从弹出按钮插入 Cocoa 核心数据项目关系的主要内容,如果未能解决你的问题,请参考以下文章

从弹出控制器ios获取按钮控制

如何从弹出按钮点击Ionic关闭侧边菜单?

从弹出窗口呈现视图

如何从弹出窗口向 boxlayout 添加新标签?

从弹出的视图控制器传递数据

如何从弹出的谷歌地图信息窗口中删除关闭按钮(x)边框?