【问题标题】:How to assign managedObjectContext to a dynamic viewController?如何将 managedObjectContext 分配给动态 viewController?
【发布时间】:2011-01-06 03:35:28
【问题描述】:

我在主屏幕上有 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;
}

【问题讨论】:

    标签: iphone core-data properties uiviewcontroller


    【解决方案1】:

    您根本不需要知道子类。由于 Objective-C 是一种动态语言,并且消息在运行时被解析,因此您可以发送消息而无需了解任何有关子类的信息。

    首先我将子类称为id(而不是UIViewController),只要您导入了它的标头,您就可以直接调用[viewController setManagedObjectContext:contexto]

    但是,如果您不想或无法导入标头,则只需使用 KVC,如下所示:

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

    【讨论】:

    • 好点。我已经改写了我的答案。我可能会争辩说,为了清楚起见和编译器的帮助,应该尽可能使用特定的类,但这只是我的意见。
    • 在 Objective-C 中通常不需要强制转换,当来自其他强类型语言时,它是一种很多形式的习惯。拥有id 的全部意义在于能够向其发送任何消息并允许在运行时进行解析。这是 Objective-C 的核心,也是允许绑定等工作的原因。了解并熟悉 KVC/KVO 是成为 Objective-C 开发人员的必要条件。没有这些知识,你只是在用有趣的括号编写 [Java|C#]。
    • 感谢 Gerry 和 Marcus,非常有帮助,让我对我的案子有了清醒的认识。太棒了,我学到的东西比我想象的要多得多。你们太棒了,它把我推向了目标 C,我现在称之为激情!非常感谢!
    【解决方案2】:

    我会将 MOC 保留在我的应用委托中,而不是将其分配给我的每个 viewController:

    在我的 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]) {
        ...
    }
    

    【讨论】:

    • 这是一个非常脆弱的设计。推荐的模式是将NSManagedObjectContextNSManagedObject 和/或NSFetchedResultsController 传递给UIViewController。这促进了重用,并允许重新安排应用程序流程更加容易。
    • 虽然我听说它不像马库斯所说的那样推荐,但我对这种方法很感兴趣。无论如何,由于我生活在这个问题的噩梦中,这将是我要走的路,但现在我正在研究可能性,谢谢你的帮助!
    【解决方案3】:

    要设置仅在子类视图控制器中的属性(例如“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;
    }
    

    【讨论】:

    • 嗯,看来我需要回到 Objective C 的一些基础知识。很高兴看到它!谢谢格里!
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多