2012-04-18 12 views
9

estoy en un lugar en mi aplicación en la que esencialmente cada ViewController tiene una NSManagedObjectContext locales:iOS Obj-C. ¿Presentando la solución correcta?

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

y cada segue pasa el managedObjectContext a través de la misma incubadora

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext]; 

Viniendo de Java, sería fácil de crear una clase abstracta que cada ViewController implementa. En Objective-c no parece que eso sea posible. Lo que quiero hacer es tener una clase base que realice este paso, pero básicamente cualquier cosa que implemente UIViewController tendrá esto (incluyendo solo un UIViewController simple así como un UITableViewController). ¿Sería posible/correcto crear una clase "abstracta" que se haga pasar por UIViewController que hace esto?

Actualización:

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

Creo que podrías estar buscando una categoría Object-c. Se usan para extender clases. – Kyle

+2

Clase posando en Objective-C 1.0 era un *** desastre ***, por lo que se ha eliminado en 2.0. No creo que haya sido alguna vez parte de la clase NSObject de iOS. – CodaFi

+0

Aunque nunca he visto clases posando en iOS, he visto algo similar para reemplazar el UINavigationBar en los controladores de navegación. – Kyle

Respuesta

5

Usted puede simplemente hacer su propia subclase de UIViewController, digamos MOCViewController, con el managedObjectContext propiedad. Luego haga que todos sus otros controladores de vista sean subclases de MOCViewController en lugar de subclasificar directamente UIViewController.

Si realmente desea hacerlo con una categoría, su categoría puede usar objc_setAssociatedObject para adjuntar el contexto del objeto administrado al controlador de vista.

Si solo tiene un contexto de objeto administrado y lo está pasando por todas partes, considere poner el contexto en una propiedad de su aplicación delegada o en una variable global.

+0

Esta fue la primera vez, pero luego necesitaría una para cada tipo, UIViewController, UIListViewController, etc. – wuntee

+0

He actualizado mi respuesta. –

5

Puede obtener managedObjectContext de un objeto administrado en lugar de pasarlo por separado. Generalmente, es más lógico pasar el objeto gestionado.

Por ejemplo: Digamos que tienes un objeto administrado denominado cosa, se puede obtener el managedObjectContext llamando

NSManagedObjectContext *moc=[thing managedObjectContext]; 

Como alternativa se puede obtener el contexto de objeto gestionado desde el delegado aplicación:

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

Esta puede ser la mejor solución. Me estaba encontrando con el caso donde ViewController no tenía un ManagedObject, pero era como 3 pasos en una navegación. No me di cuenta de que puedes obtener el contexto de AppDelegate. Sin embargo, incluso en este caso, sería bueno tener que escribir eso en la carga de cada clase ... – wuntee

Cuestiones relacionadas