OGeek|极客世界-中国程序员成长平台

标题: ios - 使用两个独立的 View Controller 更新核心数据模型 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 08:04
标题: ios - 使用两个独立的 View Controller 更新核心数据模型

我最初将我的应用设置为将一个行项目存储在我的核心数据模型中的单个实体中。从那以后,我决定更改它以允许主 uitableview 简单地列出每个项目的名称,然后当您点击一个项目时,您可以编辑项目名称并在 uitextview 中添加其他子项目。

我有两个 VC。

我现在有两个实体。

项目 --> 项目名称
列表 --> 列表名称

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

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

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

现在您可以在主 VC 上输入一个项目并保存它。如果您然后点击该项目,您将被带到允许您编辑该项目的辅助 VC。

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

这里的想法是:

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)saveid)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 中。从我认为这应该工作的方式来看,我认为我的 Edit Item VC 应该像我的 ViewController VC 一样设置。当我设置上下文等时,我不应该获取最初处理的任何内容。由于我的 Item 实体和我的 List 实体之间存在关系,所有该信息被一起获取。我的假设是否正确?

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

感谢任何在正确方向上的插入。

编辑

我补充说:

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Error: %@", error);
    abort();
}

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

例子:



Best Answer-推荐答案


我解决了这个问题。

这就是我们所做的。

首先对文件、排列等进行了认真的清理。有些对象、属性等没有意义。重命名事情有很大帮助,因为我造成了很多困惑。

我的 List 和我的 Item 实体之间存在一对一的关系。对此进行了更新,使其成为一对多的关系。一份 list ,有许多项目。使用谓词仅从模型中获取我需要的数据是真正解决问题的关键。

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

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

关于ios - 使用两个独立的 View Controller 更新核心数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834721/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4