首先,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
感谢任何帮助!
答案 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;
}