【发布时间】:2011-04-22 21:27:56
【问题描述】:
我正在制作一个基于 Core Data 的 iPhone 应用程序来存储一些数据。
它有一个UITabBarController 作为根视图控制器(RootViewController)。标签栏控制器由应用程序委托提供了两个视图控制器 - 第一个是 UIViewController 的实例,它代表应用程序的标题屏幕,第二个是 UITableViewController,用于显示数据。
这是我第一个使用 Core Data 的 iPhone 应用程序。我读过构建此类应用程序的正确方法是在应用程序委托中创建和初始化managedObjectModel、managedObjectContext 和persistentStoreCoordinator 对象,然后通过引用将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 如下:
@interface RootViewController : UITabBarController {
@private
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
我的 RootViewController 的 viewDidLoad 方法:
- (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];
}
我还检查了应用程序委托中的managedObjectContext 不为零,就在它被传递给RootViewController 实例之前。就像RootViewController 的所有 ivars 都被重置了。它只发生在这一点上。当我稍后将一个字符串从表视图控制器传递到详细视图控制器时,一切都很好。
我希望我说清楚了。我现在感觉很迷茫。
【问题讨论】:
-
什么是 NSLog(@"%@", self.managedObjectContext); TabBarController.m 中的输出?如果它为 nil,那么您实际上是在将 managedObjectContext 设置为 nil。
obiadVC.managedObjectContext = self.managedObjectContext;不应该是obiadVC.managedObjectContext = self.delegate.managedObjectContext;吗? -
不是
RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]而是一个简单的alloc/init?;
标签: iphone core-data uitabbarcontroller