【发布时间】:2014-01-31 19:00:06
【问题描述】:
在我的 iOS 应用程序的每个类的每个方法中,除了 AppDelegate,我都有以下代码行:
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
在我的 AppDelegate.h 文件中,我有这个:
NSManagedObjectContext *localContext;
在我的 AppDelegate.m 文件中我有这个:
localContext = [NSManagedObjectContext MR_contextForCurrentThread];
我最近读到,我应该在 AppDelegate 中有一行这样的代码,然后从所有其他类/方法中获得对它的多个引用。
如果我将这行代码从除 AppDelegate 之外的所有类中删除,我是否会实现这一点,但这是最好的方法吗?
更新 这是我添加到 AppDelegate.h 文件中的代码:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectContext *localContext;
这是我添加到 AppDelegate.m 文件中的代码:
// set default MagicalRecord context in all View Controllers
UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;
UINavigationController *nc = tbc.viewControllers[0];
CalendarViewController *cvController = (CalendarViewController *)nc.topViewController;
cvController.localContext = self.managedObjectContext;
nc = tbc.viewControllers[1];
WeeksApptsViewController *waController = (WeeksApptsViewController *)nc.topViewController;
waController.localContext = self.managedObjectContext;
nc = tbc.viewControllers[2];
CustomerSetupController *csController = (CustomerSetupController *)nc.topViewController;
csController.localContext = self.managedObjectContext;
nc = tbc.viewControllers[3];
AppointmentsViewController *avController = (AppointmentsViewController *)nc.topViewController;
avController.localContext = self.managedObjectContext;
nc = tbc.viewControllers[5];
SettingsViewController *sController = (SettingsViewController *)nc.topViewController;
sController.localContext = self.managedObjectContext;
当我在调试器中运行应用程序时,它在这行代码中崩溃:
CalendarViewController *cvController = (CalendarViewController *)nc.topViewController;
带有以下信息:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[CalendarViewController viewControllers]:无法识别的选择器发送到实例 0xb67ed40”
【问题讨论】:
-
您应该检查所有视图控制器的实际类。从
tbc = self.window.rootViewController开始。那真的是 UITabBarController 吗?然后检查nc = tbc.viewControllers[0]这真的是 UINavigationController 吗?等等...... - 我的猜测是第一个选项卡上的 CalendarViewController 没有嵌入到导航控制器中。在这种情况下,CalendarViewController *cvController = tbc.viewControllers[0];应该可以工作。