iOS Obj-C。提出正确的解决方案?

时间:2012-04-18 01:08:54

标签: objective-c ios

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

2 个答案:

答案 0 :(得分:5)

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

如果您真的想要使用类别,您的类别可以使用objc_setAssociatedObject将托管对象上下文附加到视图控制器。

如果您只有一个托管对象上下文并且只是将其传递到任何地方,请考虑将上下文放在应用程序委托的属性中,或者放在全局变量中。

答案 1 :(得分:5)

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

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

来获取managedObjectContext
NSManagedObjectContext *moc=[thing managedObjectContext];

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

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *moc = delegate.managedObjectContext;