2012-04-18 7 views
9

ich an einem Ort bin in meiner Anwendung, bei der im Wesentlichen alle Viewcontroller eine lokale NSManagedObjectContext haben:iOS Obj-C. Posing richtige Lösung?

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

und jede segue übergibt die managedObjectContext über den gleichen Setter

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext]; 

aus Java, wäre es einfach eine abstrakte Klasse zu erstellen, die jeder ViewController implementiert. In Objective-c scheint das nicht möglich zu sein. Was ich zu tun suche, ist eine Basisklasse, die diese Übergabe durchführt, aber im Grunde wird alles, was UIViewController implementiert, dies haben (einschließlich eines einfachen UIViewControllers und eines UITableViewControllers). Wäre es möglich/korrekt, eine "abstrakte" Klasse zu erstellen, die sich als UIViewController verhält?

Update:

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

Ich denke, Sie suchen vielleicht nach einer objektiven C-Kategorie. Sie werden verwendet, um Klassen zu erweitern. – Kyle

+2

Klasse, die in Objective-C 1.0 posierte, war ein *** ***, also wurde sie in 2.0 entfernt. Ich glaube nicht, dass es jemals ein Teil der iOS NSObject-Klasse war. – CodaFi

+0

Während ich noch nie in iOS posieren gesehen habe, habe ich etwas Ähnliches gesehen, um die UINavigationBar in Navigationssteuerungen zu ersetzen. – Kyle

Antwort

5

Sie können nur Ihre eigenen Unterklasse von UIViewController machen, lassen Sie uns MOCViewController sagen, mit der managedObjectContext Eigentum. Dann sollten alle anderen View-Controller Unterklassen von MOCViewController sein, anstatt direkt Unterklassen UIViewController.

Wenn Sie es wirklich mit einer Kategorie machen möchten, kann Ihre Kategorie objc_setAssociatedObject verwenden, um den Kontext des verwalteten Objekts an den View-Controller anzuhängen.

Wenn Sie nur einen Kontext für verwaltete Objekte haben und ihn einfach überall weiterleiten, sollten Sie den Kontext nur in eine Eigenschaft Ihres Anwendungsdelegaten oder in eine globale Variable einfügen.

+0

Das war meine erste, aber dann würden Sie eine für jeden Typ, UIViewController, UIListViewController usw. benötigen. – wuntee

+0

Ich habe meine Antwort aktualisiert. –

5

Sie können den managedObjectContext von einem verwalteten Objekt abrufen, anstatt ihn separat zu übergeben. Im Allgemeinen ist es logischer, das verwaltete Objekt zu übergeben.

Zum Beispiel: Sagen Sie bitte ein verwaltetes Objekt haben Sache genannt, können Sie die managedObjectContext von

Aufruf bekommen
NSManagedObjectContext *moc=[thing managedObjectContext]; 

Alternativ können Sie das verwaltete Objektkontext aus der Anwendung Delegierten erhalten:

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

Dies ist möglicherweise die beste Lösung. Ich lief in den Fall, in dem ein ViewController kein ManagedObject hatte, aber war wie 3 Schritte in eine Navigation. Ich habe nicht erkannt, dass Sie den Kontext einfach aus dem AppDelegate abrufen können. Aber auch in diesem Fall wäre es nett, das in die Ladung jeder Klasse schreiben zu müssen ... – wuntee