通过prepareforsegue传递ManagedObjectContext

时间:2013-11-07 08:48:15

标签: ios objective-c segue nsmanagedobjectcontext

首先,this is my basic setup。 我正在尝试将我的AppDelegate中的NSManagedObjectContext(MOC)传递给选定的自定义ViewController。

首先,在“AppDelegate.m”中,我这样做:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
FirstTableViewController *tableVC = (FirstTableViewController *)navigationController.topViewController;
tableVC.managedObjectContext = self.managedObjectContext;

将MOC传递给位于navigationController和自定义ViewController之间的tableViewController。

到目前为止,这不会导致错误。

但是,在tableViewController“FirstTableViewController.m”中,我想使用prepareforsegue将MOC传递到自定义ViewController:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"mapClicked"]) {
        CustomScrollViewController *customSVC = [segue destinationViewController];
        NSManagedObjectContext *context = self.managedObjectContext;

        [customSVC setManagedObjectContext:context];
    }
}

然后在自定义ViewController“CustomScrollViewController.m”中调用以下方法:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    self.managedObjectContext = context;
}

这就是卡住的地方。它似乎一遍又一遍地执行该方法,(see here)然后崩溃。

如果您需要查看更多代码here is the github repository

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您可能根本不需要自定义setter方法setManagedObjectContext, 因为如有必要,编译器会自动创建属性访问器方法。

但是如果使用自定义setter,它必须直接访问实例变量 在二传手中:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    _managedObjectContext = context;
}

原因是

self.managedObjectContext = context;

由编译器翻译为

[self setManagedObjectContext:context];

你有递归。

答案 1 :(得分:1)

此代码包含您的问题:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    self.managedObjectContext = context;
}

您应该简单地合成您的属性。这段代码实际上会产生这样的结果:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    [self setManagedObjectContext:context];
}

所以你去递归?所以要么合成,要么,如果你真的想自己实现它:(我假设你使用ARC,并且有一个名为_context的实例变量。

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    _context = context;
}

另外,如果你要实现自己的getter,那应该是它:

- (NSManagedObjectContext *) managedObjectContext{
    return _context;
}