使用两个独立的视图控制器更新核心数据模型

时间:2015-06-14 21:26:45

标签: ios objective-c uitableview core-data

我最初的应用设置是将一个订单项存储在核心数据模型中的单个实体中。我已决定更改此选项以允许主要的uitableview只列出每个项目的名称,然后当您点击某个项目时,您可以编辑项目名称并在uitextview中添加其他子项目。

我有两个VC。

  • 的ViewController
  • EditItem

我现在有两个实体。

项目 - > ITEMNAME
清单 - > LISTNAME

ItemList有关系 *列表 - 列表 - 项目

ListItem有关系 * items - 项目 - 列表

我有点困惑的是如何获取存储在新实体中的数据。如果ListItem的孩子,则会Item自动从List获取对象吗?

现在您可以在主VC上输入项目并保存。如果您再点击该项目,则会转到允许您编辑该项目的辅助VC。

当我在主VC中获取Item时,我是否也应该从List获取对象,然后在我的prepareforsegue方法中传递它们?

这里的想法是:

  • 如果项目名称存在且单独或编辑,则应将其写回模型
  • 如果没有todolist,则用户应将项目添加到列表中,然后点按Save会更新itemtodo list

ViewController上的当前NSFetchedResultsController

-(NSFetchedResultsController *) fetchedResultsController {
if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemname" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors;
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}

当前在EditItem上保存IBAction

- (IBAction)save:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];

if (self.editItemField) {
    // Update existing device
    self.toDoItem.itemname = self.editItemField.text;
}

NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}

[self.navigationController popViewControllerAnimated:YES];
}

修改

Edit Item VC Data Model

正如您从屏幕截图中看到的那样,我们的想法是顶部文本字段填充了前一个VC中的列表标题。这应该是应该的。然后,用户可以编辑标题或保持原样。然后,他们可以使用第二个文本字段将项目添加到该列表中。

当我在Edit Item VC上提交列表项时,新对象将保存到我的模型中,但不会显示在UITableView中。从我认为这应该工作的方式来看,我认为我的编辑项VC应该像我的ViewController VC设置一样。我不应该提取任何内容,因为在我设置我的上下文等时最初会处理它。由于我的Item实体和我的{​​{1}}实体之间存在关系,所有这些信息都会被一起提取。我在这个假设中是否正确?

当我将项目保存回List VC上的模型时,列表项与其父项名称之间是否会自动建立关联?

对这方面的正确推动表示赞赏。

修改

我补充说:

Edit Item

进入我的viewDidLoad方法。这导致数据实际填充在EditItem VC上的UITableView中,但无论我在主VC中点击哪个项目,我都会得到相同的列表。

示例:

  • 我创建了NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Error: %@", error); abort(); }
  • 点击Item 1,然后在EditItem VC中创建两个项目
  • 我回到最初的VC
  • 我创建了Item 1
  • 我在Item 2
  • 上录音
  • Item 2
  • 显示Item 1的相同列表

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。

这是做了什么。

首先是严重清理文件,安排等。有一些对象,属性等没有意义。重命名事情有很大帮助,因为我造成了很多混乱。

我的List和我的Item实体之间存在一对一的关系。这已更新,使其成为一对多的关系。一个列表,有很多项目。使用谓词从我的模型中获取我需要的数据是真正解决问题的关键。

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list == %@", self.toDoList];
        [fetchRequest setPredicate:predicate];    

现在事情按照他们应该的方式运作。主VC拥有许多列表名称。第二个VC仅显示与该特定列表相关的项目。