Cocoa touch 从modal更新核心数据

Cocoa touch 从modal更新核心数据,cocoa-touch,ios5,xcode4.2,nsmanagedobject,nsmanagedobjectcontext,Cocoa Touch,Ios5,Xcode4.2,Nsmanagedobject,Nsmanagedobjectcontext,我相信这一定是iOS应用程序中的常见模式。我有一个显示项目列表的列表控制器。我有一个segue(使用故事板)到一个模态,用于添加一个新项目,在那里我只收集名称。一旦被驳回,我将返回列表,更新它以包含添加的项目,并做一些其他的小事情(为了简单起见,让我们记录一些东西)。关键的是,我需要记录一些属于列表控制器的内容,而不是模态控制器 在此过程中的某个时刻,我还需要将新项插入到托管对象上下文中 我尝试了两种方法: 1) 使用PrepareForSegue将ManagedObjectContext传递到

我相信这一定是iOS应用程序中的常见模式。我有一个显示项目列表的列表控制器。我有一个segue(使用故事板)到一个模态,用于添加一个新项目,在那里我只收集名称。一旦被驳回,我将返回列表,更新它以包含添加的项目,并做一些其他的小事情(为了简单起见,让我们记录一些东西)。关键的是,我需要记录一些属于列表控制器的内容,而不是模态控制器

在此过程中的某个时刻,我还需要将新项插入到托管对象上下文中

我尝试了两种方法:

1) 使用PrepareForSegue将ManagedObjectContext传递到模态的控制器中。将新项插入模态控制器的上下文中。在这一点上效果很好。但现在我想刷新视图并写入日志行。我不能将这些放在视图中,因为我不希望在第一次加载或任何其他时间记录行,只有在从模式返回后才记录行

2) 使列表控制器成为模态控制器的代理,以便我可以在列表控制器本身中完成所有工作,并且仅在模态中使用保存按钮时调用列表控制器的代码(避免在每次加载时运行的问题)。但由于项是一个托管对象,我无法在不引用上下文的情况下创建它,模态控制器对此一无所知,因此我无法在模态中插入项。我也无法将其传递给委托并将其插入列表控制器,因为没有上下文就无法创建托管对象

这种流动的既定标准是什么?也许我应该将两者结合使用——将上下文传递给模态控制器,以便它能够处理自己的插入,然后调用列表控制器中的委托代码来处理日志记录

我使用的是1)和2)的组合。在prepareForSegue中创建一个新的托管对象,并将其传递给模态视图控制器。将列表控制器设置为模态视图控制器的委托,并更新委托方法中的日志记录

模态中不需要任何核心数据,它不需要知道这些事情

(事实上,如果你只是在模态中设置一个名称,它甚至不需要知道对象,你可以返回一个字符串,但是如果你确实传递了对象,如果你决定让它更有功能,它会给你更多的灵活性。)

我使用的是1)和2)的组合。在prepareForSegue中创建一个新的托管对象,并将其传递给模态视图控制器。将列表控制器设置为模态视图控制器的委托,并更新委托方法中的日志记录

模态中不需要任何核心数据,它不需要知道这些事情


(事实上,如果你只是在模式中设置一个名称,它甚至不需要知道对象,你可以只返回一个字符串,但是如果你确实传递了对象,如果你决定让它更有功能,它会给你更多的灵活性。)

啊,所以你只需要在segue中创建托管对象(使用上下文),你把它传进来,而不是上下文本身?假设您随后在委托中接收该对象(其属性现在已设置),并将其插入列表控制器?如果用户取消模式而不是确认添加,会发生什么?在列表控制器中创建的、从未设置其属性且从未插入的托管对象会发生什么情况?我是否需要将另一个委托附加到cancel按钮来清理它?我被在上下文中传递到modal并在其中创建对象的简单性所吸引,这样我就可以仅将该委托用于日志部分。但现在你提到你的选择似乎有点不雅。你能解释一下为什么模态对核心数据了解得更少更好,以及它是否重要到可以使用这么多委托关系吗?我想知道一种情况,在插入之后我没有额外的步骤(没有日志记录)。在上下文中传递意味着我根本不需要委托,但根据您的推理,我是否仍然应该通过委托插入?请考虑封装。您的列表视图控制器已经必须了解MOC,因此它是所有添加和删除操作发生的地方。模态的目的只是配置传递给它的对象。委派很容易实现,而且是cocoa中一种常见且易于理解的模式,因此使用它是有意义的。如果您在模式中有一个取消选项,那么这也可以在委托中处理,这将简单地删除新对象。你可以用无数种方法来做,但你要求建立一个标准……谢谢。最后一个问题-对于非模态控制器,您会坚持同样的原则吗?包括n-deep导航控制器?您所解释的原则是,所有子视图控制器都应该将对象传递给代理并最终返回以进行插入?我这样问是因为我看到了很多例子,其中上下文是从一个视图传递到另一个视图的。模态有什么特别之处吗(在我的示例中可能是简单)?如果模态功能更强,你会发送上下文吗?在我的示例中,对象已经插入,所以你的最后一句话不太正确。答案是,这取决于你在做什么,对不起!请注意,任何托管对象都带有指向托管对象上下文的指针,因此您不需要单独传递。啊,那么您只在segue(使用上下文)中创建托管对象,并将其传递,而不是传递上下文本身?假设您随后在委托中接收该对象(其属性现在已设置),并将其插入列表控制器?如果用户取消模式而不是确认添加,会发生什么?