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

时间:2010-10-05 04:22:50

标签: iphone xcode core-data

我正在开发我的第一个核心数据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。
  5. 在ListViewController.m中,我添加了#import MyTestAppDelegate.h“和以下代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
     if (managedObjectContext == nil) {
            managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     }
        ..
    }
    

    导致错误的顺序是点击行,返回,点击行,返回,点击行 - >错误。 managedObjectContext是第三次合成。感谢您的耐心和帮助,因为这对我来说毫无意义。

    ADDENDUM:我可能有部分解决方案。 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 个答案:

答案 0 :(得分:0)

我想我有答案。

在默认的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,由于MOC归AppDelegate所有,因此无效。