【问题标题】:passing ManagedObjectContext via prepareforsegue通过 prepareforsegue 传递 ManagedObjectContext
【发布时间】:2013-11-07 16:56:17
【问题描述】:

首先,this is my basic setup。 我正在尝试将 NSManagedObjectContext (MOC) 从我的 AppDelegate 传递给选定的自定义 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

感谢任何帮助!

【问题讨论】:

    标签: ios objective-c segue nsmanagedobjectcontext


    【解决方案1】:

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

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

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

    原因是

    self.managedObjectContext = context;
    

    被编译器翻译成

    [self setManagedObjectContext:context];
    

    然后你就有了递归。

    【讨论】:

    • 哦,我明白了!现在,当我编写 _managedObjectContext 时,我会被问到我是否指的是 managedObjectContext。我之前应该使用下划线有什么原因吗?我是否已经在属性声明 (AT)property (nonatomic,strong) NSManagedObjectContext* managedObjectContext 中添加了下划线;或仅在合成 (AT) 合成 managedObjectContext 之前;还是在两者之前?
    • @freda42: @synthesize managedObjectContext; 等价于@synthesize managedObjectContext = managedObjectContext;,因此创建的 ivar 没有前导下划线。 - 使用当前的编译器,您可以完全省略合成。然后编译器会自动插入@synthesize managedObjectContext = _managedObjectContext;,这样创建的ivar就带有一个前导下划线。这是目前推荐的样式,以便您可以轻松区分属性和 ivars。并且不要将前导下划线放在属性声明中!
    【解决方案2】:

    此代码包含您的问题:

    - (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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多