2012-04-18 2 views
9

Я на месте в моем приложении, где по существу каждый ViewController имеет локальный NSManagedObjectContext:iOS Obj-C. Правильное решение?

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

и каждый переход проходит managedObjectContext через тот же сеттер

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext]; 

Coming от Java, было бы легко создать абстрактный класс, который реализует каждый ViewController. В Objective-c это не похоже, что это возможно. То, что я хочу сделать, - это базовый класс, который выполняет эту передачу, но в основном все, что реализует UIViewController, будет иметь это (включая простой UIViewController, а также UITableViewController). Можно ли/правильно создать «абстрактный» класс, который представляет собой UIViewController, который делает это?

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

Я думаю, вы можете искать объективную категорию. Они используются для расширения классов. – Kyle

+2

Класс, созданный в Objective-C 1.0, был *** беспорядок ***, поэтому он был удален в 2.0. Я не думаю, что это вообще было частью класса iOS NSObject. – CodaFi

+0

Хотя я никогда не видел класс в iOS, я видел нечто похожее на замену UINavigationBar в навигационных контроллерах. – Kyle

ответ

5

Вы можете просто сделать свой собственный подкласс UIViewController, скажем MOCViewController, с managedObjectContext Недвижимость. Затем сделайте все ваши другие контроллеры представлений подклассы MOCViewController вместо прямого подкласса UIViewController.

Если вы действительно хотите сделать это с категорией, ваша категория может использовать objc_setAssociatedObject, чтобы связать контекст управляемого объекта с контроллером представления.

Если у вас действительно есть только один контекст управляемого объекта, и вы просто передаете его повсюду, подумайте о том, чтобы просто поместить контекст в свойство делегата приложения или в глобальную переменную.

+0

Это был мой первый, хотя, но тогда вам понадобится один для каждого типа, UIViewController, UIListViewController и т. Д. – wuntee

+0

Я обновил свой ответ. –

5

Вы можете получить managedObjectContext из управляемого объекта, а не передавать его отдельно. Как правило, более логично передать управляемый объект.

Например: Допустим, есть управляемый объект с именем вещь, вы можете получить managedObjectContext по телефону

NSManagedObjectContext *moc=[thing managedObjectContext]; 

В качестве альтернативы вы можете получить управляемый объект контекста от делегата приложения:

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

Это может быть лучшим решением. Я столкнулся с тем случаем, когда ViewController не имел ManagedObject, но был как 3 шага в навигацию. Я не понял, что вы можете просто получить контекст из AppDelegate. Однако даже в этом случае было бы неплохо написать, что в загрузке каждого класса ... – wuntee

Смежные вопросы