• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 使用两个独立的 View Controller 更新核心数据模型

[复制链接]
菜鸟教程小白 发表于 2022-12-13 08:04:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

我有两个 VC。

  • View Controller
  • 编辑项目

我现在有两个实体。

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

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

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

我有点困惑的是如何获取存储在新实体中的数据。如果 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)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 中点击哪个项目,我都会得到相同的列表。

例子:

  • 我创建 Item 1
  • 我点击 Item 1 然后在 EditItem VC 中创建两个项目
  • 我回到最初的 VC
  • 我创建 Item 2
  • 我在 Item 2
  • 上录音
  • Item 1 中的相同列表显示为 Item 2



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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap