Как назначить managedObjectContext динамическому viewController - PullRequest
1 голос
/ 17 января 2010

У меня 4 кнопки на главном экране, каждая из которых отправляет меня в viewController. Третий, отправляет меня к представлению, на котором я хочу установить управляемый объект Conject. Если я использую имя класса для создания экземпляра, все в порядке. Но я ищу способ использовать только один метод, который использует массив для получения имени класса для необходимого viewController. Но это приводит к сообщению об ошибке, как будто он не существует в целевом viewController ??? У кого-нибудь есть идеи по поводу этого подхода ??? Заранее спасибо!

Вот код:

NSArray *viewControllers = [[NSArray alloc]
initWithObjects:@"nil",@"OpcoesView",@"nil",@"TheNames", nil];

NSString *viewName = [viewControllers objectAtIndex:[sender tag]]; //the taped button tag

UIViewController *viewController = [[NSClassFromString(viewName) alloc]
initWithNibName:viewName bundle:nil];


if ([sender tag] == 3) {
    viewController.managedObjectContext = contexto;
}

Ответы [ 3 ]

2 голосов
/ 18 января 2010

Вам не нужно знать подкласс вообще. Поскольку Objective-C является динамическим языком, а сообщения разрешаются во время выполнения, вы можете отправлять сообщения, вообще не зная о подклассе.

Сначала я бы назвал подкласс id (вместо UIViewController), и, пока у вас есть импортированный заголовок, вы можете напрямую вызывать [viewController setManagedObjectContext:contexto].

Однако, если вы не хотите или не можете импортировать заголовок, просто используйте KVC следующим образом:

[viewController setValue:contexto forKey:@"managedObjectContext"];
0 голосов
/ 18 января 2010

Я бы оставил MOC в своем делегате приложения вместо назначения его каждому из моих viewControllers:

И в моем viewController .m файле:

#import "MyAppDelegate.h" // Assuming you have a property called managedObjectContext in your MyAppDelegate

@interface MyViewController (PrivateMethgods)
@property (nonatomic, readonly) NSManagedObjectContext * managedObjectContext;
@end

@implementation MyViewController
@dynamic managedObjectContext

- (NSManagedObjectContext *)managedObjectContext {
    MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
    return appDelegate.managedObjectContext;
}

Так что я могу использовать его в моем viewController следующим образом:

if ([self.managedObjectContext hasChanges]) {
    ...
}
0 голосов
/ 17 января 2010

Чтобы установить свойство, которое имеется только в контроллере представления подкласса (например, «managedObjectContext»), вы можете воспользоваться тем, что вам известен тип, подобный следующему:

NSArray *viewControllerNames = [[NSArray alloc] initWithObjects:@"nil",@"OpcoesView",@"nil",@"TheNames", nil];

NSString *viewControllerName = [viewControllerNames objectAtIndex:[sender tag]]; //the tapped button tag

UIViewController *viewController = [[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName bundle:nil];

if ([sender tag] == 3) {
    TheNames *namesVC = (TheNames*)viewController;
    namesVC.managedObjectContext = contexto;
}
...