我在主屏幕上有4个按钮,每个按钮都会将我发送到viewController。第三个,发送给我想要设置managedObjectContext的视图。如果我使用类名来创建实例,那就没问题了。但我正在寻找一种方法,只使用一个方法,使用数组来检索所需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;
}
答案 0 :(得分:2)
您根本不需要知道子类。因为Objective-C是一种动态语言,并且消息在运行时被解析,所以您可以发送消息,而不必了解有关子类的任何信息。
首先,我将子类称为id
(而不是UIViewController),只要您导入了其标题,就可以直接调用[viewController setManagedObjectContext:contexto]
。
但是,如果您不想或不能导入标题,请按以下方式使用KVC:
[viewController setValue:contexto forKey:@"managedObjectContext"];
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我会将MOC保留在我的app委托中,而不是将其分配给我的每个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]) {
...
}