首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在第二视图控制器上显示核心数据?

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

Stack Overflow用户
提问于 2010-10-05 04:22:49
回答 1查看 682关注 0票数 0

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

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

创建一个新的基于导航的应用程序,使用核心数据进行存储,将其称为创建RootViewController.

  • Add和MyTestAppDelegate新UIViewController子类的MyTest,使用UITableViewController和xib,将其称为ListViewController.

  • Copy代码(从RootViewController.h和.m到ListViewController.h和.m. ),适当地更改文件名。为了简化代码,我从所有变量中删除了尾随“_”。

  • In RootViewController,添加了#ImportListViewController.h,设置了一个数组以显示4行,并在单击第一行时导航到ListViewController。

在ListViewController.m中,我添加了#import MyTestAppDelegate.h“,并编写了以下代码:

代码语言:javascript
复制
- (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

如果我不在managedObjectContext文件中释放.m,错误就会消失。这样可以吗?那会引起我的麻烦吗?

代码语言:javascript
复制
 - (void)dealloc {
    [fetchedResultsController release];
    // [managedObjectContext release];
    [super dealloc];
}

增编2:见下文的解决办法。抱歉,格式化问题-这是我的第一篇文章。

EN

回答 1

Stack Overflow用户

发布于 2010-10-05 23:05:38

我想我有答案了。

在默认的核心数据导航控制器模板中,AppDelegate执行以下操作:

代码语言:javascript
复制
- (void)awakeFromNib {    
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    rootViewController.managedObjectContext = self.managedObjectContext;
}

RootViewController有以下代码:

代码语言:javascript
复制
@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

加号

代码语言:javascript
复制
- (void)dealloc {

    [managedObjectContext_ release];
    [managedObjectModel_ release];
    [persistentStoreCoordinator_ release];

    [navigationController release];
    [window release];
    [super dealloc];
}

换句话说,当managedObjectContext由代码设置时,无论是在上面还是在tableView: didSelectRowAtIndexPath中,它都需要被解除分配。

另一方面,如果managedObjectContext没有直接传递给View,并且使用下面的代码设置managedObjectContext.

代码语言:javascript
复制
if (managedObjectContext_ == nil) {
        managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }

..。那么managedObjectContext就不应该发布了。

答案要短得多。显然,尽管MOC是在View中分配的,但这没有任何效果,因为MOC是由http://stackoverflow.com/questions/4028797/why-dont-i-have-to-release-managedobjectcontext-in-the-2nd-tableviewcontroller拥有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3860827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档