CoreData UINavigationController managedObjectContext错误

时间:2012-11-10 03:15:54

标签: core-data uinavigationcontroller ios6 uitabbarcontroller

我有一个包含组合tabbarController和导航控制器的项目。 对不起,因为我无法发布图片,这里的图片链接:

http://s12.postimage.org/58lbzzxm5/Screen_Shot_2012_11_10_at_9_56_07_AM.png

NAppDelegate.h代码:

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface NAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator     *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

NAppDelegate.m代码:

#import "NAppDelegate.h"
#import "TVC_TabProvince.h"

@implementation NAppDelegate
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

    NSArray *arrController = [tabBarController viewControllers];
    TVC_TabProvince *controller = (TVC_TabProvince*) [arrController objectAtIndex:0];
    controller.managedObjectContext = self.managedObjectContext;

    return YES;
}

在添加导航控制器之前,它运行没有任何问题。但是当我添加它时,会出现错误:

error:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-
[UINavigationController setManagedObjectContext:]: unrecognized selector sent to
instance 0x74b26b0'

1 个答案:

答案 0 :(得分:1)

问题出在这一行:

TVC_TabProvince *controller = (TVC_TabProvince*) [arrController objectAtIndex:0];

[arrController objectAtIndex:0]是标签栏控制器的第一个视图控制器,因此这是导航控制器而不是TVC_TabProvince控制器。类型转换(TVC_TabProvince *)不会更改对象,它仍然是导航控制器。

所以你必须添加一个步骤:

NSArray *arrController = [tabBarController viewControllers];
UINavigationController *navController = [arrController objectAtIndex:0];
TVC_TabProvince *controller = [navController. viewControllers objectAtIndex:0];
controller.managedObjectContext = self.managedObjectContext;

反过来可能更灵活:不是将托管对象上下文从应用程序委托“推送”到表视图控制器,而是在需要时从表视图控制器“拉”它。所以你在“TVC_TabProvince.m”的某个地方做了

NAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.context = [appDelegate managedObjectContext];

然后,表视图控制器在视图控制器层次结构中的位置无关紧要。 (但这只是一个建议。)