我在我的应用程序中的一个地方,基本上每个ViewController都有一个本地NSManagedObjectContext:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
并且每个segue都通过相同的setter传递managedObjectContext
[segue.destinationViewController setManagedObjectContext:self.managedObjectContext];
来自Java,可以轻松创建每个ViewController实现的抽象类。在Objective-c中,似乎没有可能。我要做的是有一个执行此传递的基类,但基本上任何实现UIViewController的都将具有此功能(包括一个简单的UIViewController以及一个UITableViewController)。是否有可能/正确创建一个“抽象”类,其作为UIViewController来实现这一点?
更新
的UIViewController + ManagedObjectContext.h
@interface UIViewController (ManagedObjectContext)
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end
的UIViewController + ManagedObjectContext.m
#import "UIViewController+ManagedObjectContext.h"
@implementation UIViewController (ManagedObjectContext){
NSManagedObjectContext *context; // This is not valid, cant have local variables
}
@synthesize managedObjectContext; // This is not valid, must be @dynamic
-(void)setManagedObjectContext:(NSManagedObjectContext *)context{
//How do you have a local NSManagedObjectContext?
}
@end
答案 0 :(得分:5)
您可以使用UIViewController
属性创建自己的MOCViewController
子类,例如managedObjectContext
。然后使所有其他视图控制器成为MOCViewController
的子类,而不是直接子类化UIViewController
。
如果您真的想要使用类别,您的类别可以使用objc_setAssociatedObject
将托管对象上下文附加到视图控制器。
如果您只有一个托管对象上下文并且只是将其传递到任何地方,请考虑将上下文放在应用程序委托的属性中,或者放在全局变量中。
答案 1 :(得分:5)
您可以从托管对象获取managedObjectContext,而不是单独传递它。 通常,传递托管对象更合乎逻辑。
例如: 假设您有一个名为thing的托管对象,您可以通过调用
来获取managedObjectContextNSManagedObjectContext *moc=[thing managedObjectContext];
或者,您可以从应用程序委托中获取托管对象上下文:
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *moc = delegate.managedObjectContext;