将 NSManagedObject 传递给 UIViewController
Posted
技术标签:
【中文标题】将 NSManagedObject 传递给 UIViewController【英文标题】:passing a NSManagedObject to an UIViewController 【发布时间】:2012-01-03 17:55:50 【问题描述】:如果我,则 NSManagedObject 变为 null。我能看到的唯一解决方法是在我想将托管对象传递给的每个视图控制器中使用一个获取请求(有几个),但这似乎非常笨拙并且容易出错。
我传递托管对象的方式只是说:
viewController.subclassedManagedObject = self.subclassedManagedObject;
它在 self 中有效,但在 viewController 中为 null。我不明白为什么。任何见解将不胜感激!
非常感谢
编辑:
添加更多细节和清晰度:我有一个强大的子类 managedObject 属性,称为 viewController 中的预订。
@property (nonatomic, strong) Booking *booking;
这也是我设置 UIManagedDocument 等的 viewController。这一切都很好。我想将此 managedObject 传递给我这样做的 TableViewController 实例:
Booking *booking = [NSEntityDescription insertNewObjectForEntityForName:@"Booking" inManagedObjectContext:self.managedObjectContext];
[self.bookingDatabase saveToURL:self.bookingDatabase.fileURL
forSaveOperation:UIDocumentSaveForOverwriting
completionHandler:^(BOOL success)
if (!success)
NSLog(@"didn't work");
];
TableViewController *tableViewController = segue.destinationViewController;
tableViewController.managedObjectContext = self.managedObjectContext;
tableViewController.booking = self.booking;
tableViewController.bookingDatabase = self.bookingDatabase;
TableViewController 中的属性预订我试过既弱又强,都不起作用。目前是这样的:
@property (nonatomic, weak) Booking *booking;
再次感谢
【问题讨论】:
你能发布更多你的代码吗?你是如何展示这个视图控制器的?该属性是否设置为保留? 感谢您的浏览。是的,我在原来的帖子中发布了更多内容。 【参考方案1】:您将 self.booking 传递给 tableViewController 但您创建的内容看起来像一个新的局部变量:
Booking *booking = [NSEntityDescription insertNewObjectForEntityForName:@"Booking" inManagedObjectContext:self.managedObjectContext];
应该是什么时候
self.booking = [NSEntityDescription insertNewObjectForEntityForName:@"Booking" inManagedObjectContext:self.managedObjectContext];
如果这不能解决问题,您可以尝试设置 NSManagedObjectContext 以保留新对象,当您转换到新的 tableViewController 时,自动释放的 NSManagedObject 可能会消失:
[managedObjectContext setRetainsRegisteredObjects:YES];
【讨论】:
不客气!如果您不需要更多答案,则应将此答案标记为已接受。【参考方案2】:您是否验证过tableViewController
不为零?
您的@property
绝对应该是强大的,因为视图控制器正在获取实体的所有权。 weak
引用肯定会为零。
同样,我也会在调试器中放置一个断点并确认[self booking]
确实在代码中的那个位置指向一个有效的对象。
【讨论】:
【参考方案3】:不确定这是否是正确的方法,我没有任何文件可以引用。但我相信你应该创建一个单例,在打开时将你的值从你的托管对象加载到单例中,并在你的 uiviewcontrollers 中使用它。
然后在关闭时将单例保存到您的托管对象
【讨论】:
永远不要使用单例。它们是将自己编码到无法维护的角落的最快方法。 嗯,这不是真的,我所读到的所有单例都很好,如果你做对了,你甚至可以让它们线程安全。关于单例的论点都是基于线程安全而不是“不可维护的角落”,我觉得你不仅将我标记为一个,而且在你的推理中使用模糊的术语,这很侮辱我 单身人士是邪恶的,尤其是在移动设备上。它们不允许您拆除它们,它们不允许适当的内存管理,它们会导致整个代码库的紧密耦合。不应使用它们。争论不仅涉及线程安全,还涉及耦合和内存管理。 @MarcusS.Zarra 我不认为单例是解决这个问题的方法,如果有的话,它只是一种策略,它不能解决 OPs 问题。然而,我不同意你的笼统说法,在软件开发中有一些非常好的单例用例。不过,这完全是个人喜好问题,不需要特定的设计模式。 更不用说一些核心类是单例的。 “几个 Cocoa 框架类是单例的。它们包括 NSFileManager、NSWorkspace,以及在 UIKit 中的 UIApplication 和 UIAccelerometer。” developer.apple.com/library/mac/#documentation/General/…以上是关于将 NSManagedObject 传递给 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
restkit 0.20:无法将 NSManagedObject 传递给 getObject: 方法
如何将 NSManagedObject 传递给 NSPredicate 以及如何保存一对多的实体
NSManagedObject 传递给 ViewController 是不是反映所有更新