如何在第二个视图控制器上显示核心数据?
Posted
技术标签:
【中文标题】如何在第二个视图控制器上显示核心数据?【英文标题】:How do I display core data on second view controller? 【发布时间】:2010-10-05 04:22:49 【问题描述】:我正在开发我的第一个核心数据 iPhone 应用程序。我正在使用导航控制器,根视图控制器显示 4 行。单击第一行会将我带到第二个表视图控制器。但是,当我单击后退按钮时,重复行点击,再次单击后退按钮,然后第三次点击行,我得到一个错误。我已经研究了一周,但没有成功。
我可以很容易地重现错误:
-
创建一个新的基于导航的应用程序,使用 Core Data 进行存储,将其命名为 MyTest,它会创建 MyTestAppDelegate 和 RootViewController。
添加新的 UIViewController 子类,带有 UITableViewController 和 xib,将其命名为 ListViewController。
将代码从 RootViewController.h 和 .m 复制到 ListViewController.h 和 .m,并相应地更改文件名。为了简化代码,我从所有变量中删除了结尾的“_”。
在 RootViewController 中,我添加了#import ListViewController.h,设置一个数组以显示 4 行并在单击第一行时导航到 ListViewController。
在 ListViewController.m 中,我添加了#import MyTestAppDelegate.h”和以下代码:
- (void)viewDidLoad
[super viewDidLoad];
if (managedObjectContext == nil)
managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
..
导致错误的顺序是点击行,返回,点击行,返回,点击行->错误。 managedObjectContext 第三次合成。感谢您的耐心和帮助,因为这对我来说毫无意义。
附录:我可能有部分解决方案。 http://www.iphonedevsdk.com/forum/iphone-sdk-development/41688-accessing-app-delegates-managed-object-context.html
如果我不释放 .m 文件中的 managedObjectContext,错误就会消失。可以吗?还是会导致我出现问题?
- (void)dealloc
[fetchedResultsController release];
// [managedObjectContext release];
[super dealloc];
附录 2:请参阅下面的解决方案。抱歉格式问题 - 这是我的第一篇文章。
【问题讨论】:
【参考方案1】:我想我有答案。
在默认的 Core Data Navigation Controller 模板中,AppDelegate 执行以下操作:
- (void)awakeFromNib
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;
RootViewController 代码如下:
@interface PractitionerAppDelegate : NSObject <UIApplicationDelegate>
UIWindow *window;
UINavigationController *navigationController;
@private
NSManagedObjectContext *managedObjectContext_;
NSManagedObjectModel *managedObjectModel_;
NSPersistentStoreCoordinator *persistentStoreCoordinator_;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSString *)applicationDocumentsDirectory;
@end
加
- (void)dealloc
[managedObjectContext_ release];
[managedObjectModel_ release];
[persistentStoreCoordinator_ release];
[navigationController release];
[window release];
[super dealloc];
也就是说,当managedObjectContext被代码设置时,无论是如上还是在tableView中:didSelectRowAtIndexPath,那么它都需要被释放。
另一方面,如果managedObjectContext不直接传给View Controller,使用下面的代码来设置managedObjectContext...
if (managedObjectContext_ == nil)
managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
... 那么 managedObjectContext 不应该被释放。
这里有一个更简短的答案。 http://***.com/questions/4028797/why-dont-i-have-to-release-managedobjectcontext-in-the-2nd-tableviewcontroller 显然,尽管 MOC 是在 View Controller 中分配的,但由于 MOC 归 AppDelegate 所有,因此没有任何效果。
【讨论】:
以上是关于如何在第二个视图控制器上显示核心数据?的主要内容,如果未能解决你的问题,请参考以下文章
在 UIPickerView 上选择行时如何使用信息填充第二个视图控制器
iOS 7:如何在一个视图控制器中将状态栏文本颜色更改为白色,在第二个视图控制器中更改为黑色?
如何将第二个表格视图的值与第一个表格视图的单击行的关系分开?