2010-01-17 3 views
1

У меня есть 4 кнопки на главном экране, каждый отправляет меня в viewController. Третий, отправляет меня на представление, на котором я хочу установить managedObjectContext. Если я использую имя класса для создания экземпляра, все в порядке. Но я ищу способ использовать только один метод, который использует массив для получения имени класса для необходимого viewController. Но это приводит к сообщению об ошибке, как будто этого не существует на целевом viewController ??? У кого-нибудь есть идеи об этом aproach ??? Заранее спасибо!Как назначить managedObjectContext для динамического 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; 
} 

ответ

2

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

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

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

[viewController setValue:contexto forKey:@"managedObjectContext"]; 
+0

Хорошая точка. Я переформулировал свой ответ. Я бы предположил, что для ясности и помощи от компилятора нужно использовать определенные классы, но это только мое мнение. – gerry3

+0

Кастинг, как правило, не нужен в Objective-C, и это привычка многих форм при переходе с других строго типизированных языков. Весь смысл иметь «id» - это возможность отправить ему какое-либо сообщение и разрешить разрешение во время выполнения. Это находится в центре Objective-C и что позволяет связывать и т. Д. Работать. Знакомство и удобство с KVC/KVO - это требование стать разработчиком Objective-C. Без этих знаний вы просто пишете [Java | C#] со смешными скобками. –

+0

Спасибо, Джерри и Маркус, очень помогли и очистили мое мнение о моем случае. Это было здорово, и я узнал гораздо больше, чем когда-либо ожидал. Вы, ребята, были великолепны, и это подтолкнуло меня больше к объективному C, и я называю это сейчас страстью! Большое спасибо! –

0

Чтобы установить свойство, которое только в контроллере представления подкласса (например, «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; 
} 
+0

Humm, кажется, что мне нужно вернуться к некоторым основам цели C. Отлично видеть это! Спасибо, Джерри! –

0

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

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

#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]) { 
    ... 
} 
+1

Это * очень * хрупкий дизайн. Рекомендуемый шаблон - это передать «NSManagedObjectContext», «NSManagedObject» и/или «NSFetchedResultsController» в UIViewController. Способствует повторному использованию и позволяет значительно упростить процесс подачи заявки. –

+0

Я проговорил об этом, хотя я слышал, что Его не рекомендовали, как сказал Маркус. Во всяком случае, поскольку я жил в кошмаре с этой проблемой, это было бы моим путем, но теперь я изучаю возможности, спасибо за вашу помощь! –

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