9

我在我的应用程序中的一个地方,基本上每个 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
4

2 回答 2

5

您可以使用属性创建自己的子类UIViewController,比如说。然后让所有其他视图控制器成为子类而不是直接子类化。MOCViewControllermanagedObjectContextMOCViewControllerUIViewController

如果你真的想用一个类别来做,你的类别可以objc_setAssociatedObject用来将托管对象上下文附加到视图控制器。

如果你真的只有一个托管对象上下文并且你只是到处传递它,考虑把上下文放在你的应用程序委托的一个属性中,或者放在一个全局变量中。

于 2012-04-18T01:52:47.473 回答
5

您可以从托管对象获取 managedObjectContext 而不是单独传递它。通常,传递托管对象更合乎逻辑。

例如:假设您有一个名为 thing 的托管对象,您可以通过调用来获取 managedObjectContext

NSManagedObjectContext *moc=[thing managedObjectContext];

或者,您可以从应用程序委托中获取托管对象上下文:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *moc = delegate.managedObjectContext;
于 2012-04-18T02:04:09.723 回答