Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将ManagedObjectContext传递给第二个视图_Iphone_Objective C_Cocoa Touch_Core Data - Fatal编程技术网

Iphone 将ManagedObjectContext传递给第二个视图

Iphone 将ManagedObjectContext传递给第二个视图,iphone,objective-c,cocoa-touch,core-data,Iphone,Objective C,Cocoa Touch,Core Data,我正在编写我的第一个iPhone/Cocoa应用程序。它在导航视图中有两个表视图。在第一个表视图中触摸一行时,将转到第二个表视图。我希望第二个视图显示与您在第一个视图中接触的行相关的CoreData实体的记录 我的CoreData数据在第一个表视图中显示良好。您可以触摸一行并转到第二个表格视图。我能够将所选对象的信息从第一个视图传递到第二个视图。但是,我无法让第二个视图自行获取CoreData。就我而言,我无法将managedObjectContext对象传递给第二个视图控制器。我不想在第一个视

我正在编写我的第一个iPhone/Cocoa应用程序。它在导航视图中有两个表视图。在第一个表视图中触摸一行时,将转到第二个表视图。我希望第二个视图显示与您在第一个视图中接触的行相关的CoreData实体的记录

我的CoreData数据在第一个表视图中显示良好。您可以触摸一行并转到第二个表格视图。我能够将所选对象的信息从第一个视图传递到第二个视图。但是,我无法让第二个视图自行获取CoreData。就我而言,我无法将managedObjectContext对象传递给第二个视图控制器。我不想在第一个视图中查找并传递字典,因为我希望能够在第二个视图中使用搜索字段来优化结果,并从中向CoreData数据插入新条目

下面是从第一个视图过渡到第二个视图的函数

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here -- for example, create and push another view controller.
    NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];

    secondViewController.tName = [[selectedObject valueForKey:@"name"] description];
    secondViewController.managedObjectContext = [self managedObjectContext];

    [self.navigationController pushViewController:secondViewController animated:YES];
    [secondViewController release];
}
这是SecondViewController中崩溃的函数:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = tName;

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) { // <-- crashes here
        // Handle the error...
    }
}

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    /*
     Set up the fetched results controller.    
     */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
        // **** crashes on the next line because managedObjectContext == 0x0
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity];

    // <snip> ... more code here from Apple template, never gets executed because of the crashing

    return fetchedResultsController;
}
-(void)viewDidLoad{
[超级视图下载];
self.title=tName;
n错误*错误;

如果(![[self-fetchedResultsController]performFetch:&error]){/您确定有一个名为“SecondEntity”的实体吗?(这是解释错误消息的最直接的方法。)

但是,如果这是一个主列表->详细视图类型的交互,我建议将所选对象直接传递给第二个视图控制器,而不是只给它“tname”。该对象可能包含通过其属性直接填充第二个表所需的所有内容

这样,您实际上不会在第二个视图控制器中执行任何显式抓取。即:

@interface SecondViewController : UITableViewController
@property (nonatomic, retain) NSManagedObject *selectedObject;
@end

@implementation SecondViewController
- (void)viewDidLoad
{
    NSMutableArray *stuff = [[[selectedObject valueForKey:@"aToManyRelationship"] allObjects] mutableCopy];
    // sort stuff the way you want to display them, etc.
}
...

只是为了好玩..尝试替换:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:managedObjectContext]; 
与:


您正在通过setter设置managedObjectContext,然后尝试直接访问ivar。根据属性的定义,这可能不正确。[self-managedObjectContext]将尝试通过getter而不是直接访问值。

哦,这很有趣。我花了一些时间处理堆栈跟踪,我想我已经找到了答案

因此pushViewController调用viewDidLoad不是一次,而是两次。第一次调用viewDidLoad时,对象似乎没有正确实例化。第二次,它们是。因此,此代码第一次运行时无法访问managedObjectContext并引发异常。第二次运行时,一切正常。没有崩溃


有很多文献提到了viewDidLoad在Google上多次执行的问题,因此我认为解决方案是不在viewDidLoad中执行此获取请求初始化。

我一直在努力解决同样的问题,但我仍然只是一个新手。我想我知道了发生了什么。请告诉我这是否有意义

简而言之,您正在尝试从尚未设置的objectContext中获取实体。因此,您的选项是立即设置实体,或者在加载此视图之前在应用程序的其他位置进行设置

如果您的应用程序的设置与iphone开发中心的CoreDataBooks应用程序演示类似,并且主UIApplicationDelegate也管理CoreData堆栈,那么您应该能够执行以下操作:


if(managedObjectContext==nil){
managedObjectContext=[[UIApplication sharedApplication]委托]managedObjectContext];
}


这应该可以解决问题。

有一件事是肯定的,那就是: secondViewController.managedObjectContext=[self-managedObjectContext]

应该是: secondViewController.managedObjectContext=self.managedObjectContext


除非当前对象实现了一个名为“managedObjectContext”的方法,该方法返回该变量。

这可能就是问题所在

简短回答:删除你的应用,然后再次运行

长答覆:

如果您构建并运行项目,CoreData会将您的模型保存到您所说的任何位置(持久存储位置)

如果您更改CoreData模型中的某些内容,则当您再次运行应用程序时,新模型将与保存的模型不匹配,从而导致该错误


若要修复此问题,请删除你的应用程序。这将删除保存的模型,当你再次运行它时,它将重新创建你的新模型。

你可以通过先强制转换你的应用程序委托来抑制'-managedObjectContext'not found in protocols'警告:

if (managedObjectContext == nil) { managedObjectContext = [(MyAppDelegateName *)[[UIApplication sharedApplication] delegate] managedObjectContext]; }

我遇到了这个问题,发现我的对象的init消息在调用setManagedObjectContext之前正在访问managedObjectContext

之前:

 dataController = [[DataController alloc] init];
 [dataController setManagedObjectContext:[self managedObjectContext]];
之后:

 dataController = [DataController alloc];
 [dataController setManagedObjectContext:[self managedObjectContext]];            
 [dataController init];

feh.新手错误。

苹果提供了一个名为“iPhoneCoreDataRecipes”的示例项目。有一篇关于传递NSManagedObjectContext的非常有趣的文章 如果尝试实现这种逻辑,则每个managedObjectContext在每个UIViewController中都是一个独立的孤岛

尝试更改代码

if (managedObjectContext == nil) { managedObjectContext = [(MyAppDelegateName *)[[UIApplication sharedApplication] delegate] managedObjectContext]; }
用这个

if (managedObjectContext == nil) { managedObjectContext = self.managedObjectContext }

在第一个
tableViewController
中,您可以通过以下方式传递
managedObjectContext
secondTableController.managedObjectContext=[(AppDelegate*)[[UIApplication sharedApplication]委托]managedObjectContext]
,也许没关系

当您将初始化获取结果控制器的代码放入viewDidLoad时会发生什么?我有一个应用程序,它基本上做相同的事情,对我来说工作正常,但我使用initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName直接在viewDidLoad中创建获取结果控制器:@Tim我刚刚试过,它以同样的方式崩溃。奇怪的是,如果我设置断点,self的所有成员变量都为NULL,但是标题设置正确,所以这不可能是真的。是的,实体存在。它不是master list->detail。它更像是category->items,我希望能够直接与数据进行交互因为第二个视图实际上是主int
if (managedObjectContext == nil) { managedObjectContext = self.managedObjectContext }