将 TextField 条目从模态视图控制器保存到核心数据单独的实体

Posted

技术标签:

【中文标题】将 TextField 条目从模态视图控制器保存到核心数据单独的实体【英文标题】:Saving TextField Entries from a Modal View Controller to Core Data Separate Entities 【发布时间】:2013-11-15 17:45:50 【问题描述】:

我正在开发一个基本但有效的应用程序。前提是:

导航控制器中有一个带有加号按钮的表格视图控制器,用户按下加号按钮,它会弹出一个模态视图;要求用户在 4 个文本字段中输入以下信息:姓名、金额、标题和日期。

我有以下型号:

具有 wasCompleted 属性的事务实体 具有名称属性的人员实体 具有标题属性的动作实体 具有金额属性的物品实体

事务实体与Person、Action 和Item 有关系。

当用户按下保存时,我有以下代码将所有这些信息保存到核心数据数据库:

- (IBAction)save:(id)sender

    NSManagedObjectContext *context = [self managedObjectContext];

    NSManagedObject *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    NSManagedObject *actionEvent = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
    NSManagedObject *amountType = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:context];

    [person setValue:self.nameTextField.text forKey:@"name"];
    [occasionEvent setValue:self.actionTextField.text forKey:@"title"];
    [occasionEvent setValue:self.dateTextField.text forKey:@"dateOfEvent"];
    [amountType setValue:self.itemTextField.text forKey:@"amount"];

    [transaction setValue:person forKey:@"whoBy"];
    [transaction setValue:actionEvent forKey:@"occasion"];
    [transaction setValue:amountType forKey:@"item"];


这很好用,但当然,它不是最好的面向对象编程,也不是带有 setValues 等的出色代码。

我想要实现的是在保存按钮中:

调用 Transaction NSManagedObject 子类来创建一个新事务,我将在其中检查该事务是否存在,如果不存在,我将创建带有 wasCompleted 属性的 Transaction 对象,然后调用 Person NSManagedObject 类来创建该属性。 Transaction NSManagedObject 子类当然也调用 Action 和 Item 类来做到这一点。

我想我会使用类别来做到这一点(基于观看 CS193p iTunes U 课程),我花了几个小时试图弄清楚我实际通过了什么。从保存按钮,我得到了 NSManagedObjectContext,这是我想通过的一部分(虽然我使用的是 AppDelegate 中的 NSManagedObjectContext),但老实说,我不知道我会传递给事务 NSManagedObject子类。

我的问题是: 1)我是否应该创建一个字典/数组来保存用户在模态视图类中添加的所有详细信息并将其传递给 Transaction NSManagedObject 子类?或者,

2) 有没有更好的方法将用户添加的信息传递给 Transaction NSManagedObject 子类?或者,

3) 我应该从 Add Entry Modal View 还是从 Transaction NSManagedObject 子类调用 Person、Action 和 Item 实体?

4) 创建类别是否正确?

5) 您能否提供一个简单的单行示例代码,说明我将传递给事务实体的内容?

对此的任何帮助将不胜感激。我已经被困了几个小时,我认为这不会那么困难,但我只是迷路了!我是 ios 开发的新手!

编辑:

我想提供更多信息。我有每个实体(Person、Transaction 等)的 NSManagedObject 子类,但除了将属性作为属性保存之外,它们目前并没有真正做任何事情。在 TableView 和 cellForRowAtIndexPath 方法中,我正在调用 transaction.whoBy.name 等,这一切正常。根据 Mundi 的最新回复,我觉得这很有帮助,但只需要一点信息。模态视图将绝对用于添加新条目,但也用于编辑现有条目,因此我必须检查它是新条目还是现有条目,然后传递该数据。

我将如何去做这样的事情:

1) 如果对象不存在,则使用每个属性创建一个新对象。 2)如果确实存在,则调用该属性。我从您的代码中看到它与:

NSManagedObjectContext *context = transaction.managedObjectContext; 

所以在这种情况下,在添加条目中,我只需要添加一些验证检查(因为如果我有两个同名条目,我不希望 NAME 选项卡显示该信息两次,它应该是一个条目等),我会坚持我现在拥有的代码,用于从保存方法创建事务、人员、操作,但添加那些额外的验证检查?抱歉,有点迷路了!

我完全理解传递现有数据的提及,但在代码中,我只是不确定如何实现这一点。

【问题讨论】:

【参考方案1】:

我不认为在实体类本身,甚至在一个类别中创建实体是一个很好的模式。原则上,您通过在控制器中创建和链接实体(这就是控制器的用途)来做正确的事情。

您应该做的是创建NSManagedObject 子类(通过Core Data 模型编辑器中的Xcode 命令)。这提供了对象图的真实反映,并产生了非常漂亮和可读的代码。

如果您的模态视图控制器用于创建或编辑一个事务实例,我会将现有的或新的事务对象传递给它。您可以从实例本身获取托管对象上下文。

NSManagedObjectContext *context = transaction.managedObjectContext; 

如果传递的交易对象有数据,您可以使用现有数据填充您的文本字段。如果在编辑后按下“取消”而不是“保存”,您只需删除新交易或保持现有交易不变。

NSManagedObject 子类允许您以更易读的形式设置属性和关系。例如:

person.name = self.nameTextField.text;
transaction.whoBy = person;
// etc.

顺便说一句,当您在代码中编写 occasionEvent 时,我想您可能指的是 actionEvent

还有一点:Occasion 实体的dateOfEvent 属性肯定是NSDate 类型,而不是字符串。因此,您可以将文本中的日期(在文本字段中)转换为正确的 NSDate 类型。虽然可以这样做,但更好的解决方案是使用UIDatePicker 来选择日期。从 iOS 7 开始,选择器应该与文本字段一起集成到控制器的视图中,而不是作为单独的模式视图控制器。

【讨论】:

亲爱的@Mundi - 感谢您的精彩回复 - 这非常有帮助。我走在正确的道路上,这很有趣。我一直认为创建一个 Transaction 对象应该在 Transaction 类中,但这真的很有趣。我有 Transaction、Person 等实体的 NSManagedObject 子类,但它们目前没有做任何事情.. 虽然在 cellForRowAtIndexPath 中,我正在调用 transaction.name 等,所以我看到它与它一起工作.. 我要去编辑原始问题以在其中填写更多信息,因为您提到的内容很有意义.. 嗨 Mundi - 我刚刚添加了更多信息(以及更多问题),因为我只是有点不确定接下来的步骤 - 我想添加验证,所以我要么创建一个新对象,要么传递一个现有对象..所以任何进一步的帮助将不胜感激!另外,绝对是 - 我的操作、场合事件和感谢 NSDate 建议的错字 - 这是我必须完成的另一项任务,因为我将它设置为字符串只是为了确保它有效,但我确实会研究 UIPicker - 再次感谢

以上是关于将 TextField 条目从模态视图控制器保存到核心数据单独的实体的主要内容,如果未能解决你的问题,请参考以下文章

从 SpreadsheetView 检索 TextField 用户条目

将 NSMutableArray 从模态视图控制器传递到父视图

关闭模态呈现的视图控制器后切换标签栏控制器视图控制器

如何从一个模态视图控制器添加新的表格单元格数据?

如何将params从其他视图模态窗体发送到另一个控制器

在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图