如何在第二个视图控制器上显示核心数据?

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:如何在一个视图控制器中将状态栏文本颜色更改为白色,在第二个视图控制器中更改为黑色?

如何将第二个表格视图的值与第一个表格视图的单击行的关系分开?

将数据移动到另一个视图控制器,但第二个视图控制器在第一个视图控制器之前加载

数组中的数据未显示在第二个 UIPickerView 中