如何使用 NSManagedObject 对象在视图控制器之间传递自定义属性?

Posted

技术标签:

【中文标题】如何使用 NSManagedObject 对象在视图控制器之间传递自定义属性?【英文标题】:How to pass a custom property between view controller using NSManagedObject object? 【发布时间】:2014-04-17 14:09:27 【问题描述】:

我正在开发一个简单的笔记应用程序,我在数据模型中创建了一个名为“Note”的实体,它只有一个名为“content”的 nsstring 类型的属性。

现在我使用编辑器从数据模型部分创建了一个 Note 类/创建 NSManagedObject 子类。

在我的创建笔记视图控制器中,我正在使用 prepareForSegue 方法将数据保存到数据库,如下所示:

@implementation NOCreateNotesViewController

- (NSManagedObjectContext *) managedObjectContext

    NSManagedObjectContext *context = nil;

    id delegate = [[UIApplication sharedApplication] delegate];

    if ([delegate performSelector:@selector(managedObjectContext)]) 
        context = [delegate managedObjectContext];
    

    return context;



- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if (sender != self.saveButton) return;
    if (self.noteText.text.length > 0) 
        self.note = [[Note alloc] init];
        self.note.content = self.noteText.text;
    

    NSManagedObjectContext * context = [self managedObjectContext];

    // creating a new managed object

    NSManagedObject *newNote = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:context];

    [newNote setValue:self.noteText.text forKey:@"content"];

    NSError * error = nil;

    if ([context save:&error]) 
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    

但我不想通过这种方式传递用户想要编辑的对象(即表格视图中选定行中的注释):

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"editeNote"]) 
        NSManagedObject * selectedNote = [self.notes objectAtIndex:[self.tableView indexPathForSelectedRow].row];
        NOCreateNotesViewController * destination = [segue destinationViewController];
        destination.note = selectedNote;
    

显然我不能传递一个带有指向 NSManagedObject 的指针的 N​​ote 对象...这是因为如果这是一个编辑转场而不是创建一个新的转场,我想更新我的 Note 实体。

在tutorial I learned core data basics from 中,他们只使用动态创建对象进行教学,并注意使用编辑器/创建 NSManagedObject 子类的对象的自定义类,所以我有点困惑..

请帮忙

【问题讨论】:

【参考方案1】:
NSManagedObject * selectedNote = [self.notes objectAtIndex:[self.tableView indexPathForSelectedRow].row];

想成为:

Note * selectedNote = [self.notes objectAtIndex:[self.tableView indexPathForSelectedRow].row];

为什么要在 prepareForSegue: 中将数据保存到模型中?您确定在视图中有保存或完成按钮吗?

【讨论】:

我有一个保存按钮。哦,我想我明白了,所以我应该将便笺传递给目标控制器,而不是在保存它时为 segue 做准备,我可以检查便笺 note 是否不是 nil 我保存了吗?

以上是关于如何使用 NSManagedObject 对象在视图控制器之间传递自定义属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个托管对象上下文中初始化新的 NSManagedObject 并设置与另一个 NSManagedObject 的关系?

NSManagedObject 如何重新加载

使用 CoreData,我如何确定 NSManagedObject 是不是在特定上下文中?

MFC在视类中如何退出程序

每次创建新对象时迭代 NSManagedObject 的属性

如何在不复制目标 NSManagedObject 的情况下将目标 NSManagedObject 添加到另一个具有反向多对多核心数据关系的对象?