将managedObjectContext传递给UITabBarController问题

时间:2011-04-22 21:27:57

标签: iphone core-data uitabbarcontroller

我正在制作一个基于Core Data的iPhone应用程序来存储一些数据。

它有一个UITabBarController作为根视图控制器(RootViewController)。标签栏控制器由应用程序委托给予两个视图控制器 - 第一个是UIViewController的实例,表示应用程序的标题屏幕,第二个是UITableViewController,用于显示数据。

这是我第一个使用Core Data的iPhone应用程序。我已经了解到构建此类应用程序的正确方法是在应用程序委托中创建并初始化managedObjectModelmanagedObjectContextpersistentStoreCoordinator对象,然后传递{{1}通过引用到子视图控制器。这就是我做到的。

但是,我没有设法将managedObjectContext对象传递到我在应用程序委托managedObjectContext

中初始化的标签栏控制器中
applicationDidFinishLaunching:

即使标签栏显示正确并加载标题屏幕视图控制器,其- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { RootViewController *rootViewController = [[RootViewController alloc] init]; rootViewController.managedObjectContext = self.managedObjectContext; [window addSubview:rootViewController.view]; [window makeKeyAndVisible]; [rootViewController release]; return YES; } 仍为零。我无法弄清楚我做错了什么。我还尝试通过向其添加新的保留属性来传递managedObjectContext字符串。

我的RootViewController内容如下:

RootViewController.h

我的RootViewController的viewDidLoad方法:

@interface RootViewController : UITabBarController {
@private 
NSManagedObjectContext *managedObjectContext;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end

}

我还检查了应用程序委托中的- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@", self.managedObjectContext); ObiadViewController *obiadVC = [[ObiadViewController alloc] init]; ObiadListNavController *obiadListVC = [[ObiadListNavController alloc] init]; obiadVC.managedObjectContext = self.managedObjectContext; obiadListVC.managedObjectContext = self.managedObjectContext; NSArray *vcs = [NSArray arrayWithObjects:obiadVC, obiadListVC, nil]; self.viewControllers = vcs; [obiadVC release]; [obiadListVC release]; 不是nil,就在它传递给managedObjectContext实例之前。这就像所有RootViewController的ivars重置一样。它只发生在这一点上。

,当我稍后将表格视图控制器中的字符串传递给详细视图控制器时,一切都很好。

我希望自己清楚明白。我现在感觉很无能为力。

1 个答案:

答案 0 :(得分:2)

UITabBarController Class Reference明确指出UITabBarController不应该是子类:

  

此类不适用于子类化。

在这种情况下,你可以实例化你的UITabBarController并在你的App Delegate的applicationDidFinishLaunching中添加视图控制器:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    tabBarController = [[UITabBarController alloc] init];

    FirstViewController *firstViewController = [[FirstViewController alloc] init];
    SecondViewController *secondViewController = [[SecondViewController alloc] init];

    firstViewController.managedObjectContext = self.managedObjectContext;
    secondViewController.managedObjectContext = self.managedObjectContext;

    NSArray *vcs = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];
    tabBarController.viewControllers = vcs;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    [firstViewController release];
    [secondViewController release];

    return YES;
}

希望它有所帮助。