【问题标题】:How do I display core data on second view controller?如何在第二个视图控制器上显示核心数据?
【发布时间】:2010-10-05 04:22:49
【问题描述】:

我正在开发我的第一个核心数据 iPhone 应用程序。我正在使用导航控制器,根视图控制器显示 4 行。单击第一行会将我带到第二个表视图控制器。但是,当我单击后退按钮时,重复行点击,再次单击后退按钮,然后第三次点击行,我得到一个错误。我已经研究了一周,但没有成功。

我可以很容易地重现错误:

  1. 创建一个新的基于导航的应用程序,使用 Core Data 进行存储,将其命名为 MyTest,它会创建 MyTestAppDelegate 和 RootViewController。
  2. 添加新的 UIViewController 子类,带有 UITableViewController 和 xib,将其命名为 ListViewController。
  3. 将代码从 RootViewController.h 和 .m 复制到 ListViewController.h 和 .m,并相应地更改文件名。为了简化代码,我从所有变量中删除了结尾的“_”。
  4. 在 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:请参阅下面的解决方案。抱歉格式问题 - 这是我的第一篇文章。

【问题讨论】:

    标签: iphone xcode core-data


    【解决方案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://stackoverflow.com/questions/4028797/why-dont-i-have-to-release-managedobjectcontext-in-the-2nd-tableviewcontroller 显然,尽管 MOC 是在 View Controller 中分配的,但由于 MOC 归 AppDelegate 所有,因此没有任何效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多