2010-01-17 68 views
1

我在主屏幕上有4个按钮,每个按钮都将我发送给viewController。第三个,发送给我想要设置managedObjectContext的视图。如果我使用类名来创建一个实例,那没关系。但我正在寻找一种方法来使用一种方法,它使用一个数组来检索所需viewController的Class的名称。但它导致了一个错误消息,就像它不存在于目标viewController中一样?任何人有关于这个问题的任何想法?提前致谢!如何将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 2010-01-18 04:05:41

+0

在Objective-C中投射通常是不必要的,而且当来自其他强类型语言时,这是一种很多形式的习惯。具有'id'的全部要点是能够发送任何消息并允许在运行时发生分辨率。这是Objective-C的核心,允许绑定等工作。 了解并熟悉KVC/KVO是成为Objective-C开发人员的必备条件。没有这些知识,你只需编写带有有趣括号的[Java | C#]。 – 2010-01-18 17:27:23

+0

感谢Gerry和Marcus,非常有帮助,并且清楚了解我的情况。这很棒,而且我学到的东西比我预想的要多得多。你们很棒,它让我更加注重客观的C,现在我把它称为激情!非常感谢! – 2010-01-19 15:00:42

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的一些基本原理。很高兴看到它!谢谢Gerry! – 2010-01-19 15:02:59

0

我会保持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]) { 
    ... 
} 
+1

这是一个*非常*脆弱的设计。推荐的模式是将'NSManagedObjectContext','NSManagedObject'和/或'NSFetchedResultsController'传递给UIViewController。促进重用并允许重新安排应用程序流程更容易。 – 2010-01-18 17:25:10

+0

虽然我听说它没有像马库斯说的那样推荐,但我对此有所顾虑。无论如何,因为我生活在这个问题的噩梦中,这将是我的出路,但现在我正在研究可能性,感谢您的帮助! – 2010-01-19 14:19:44

相关问题