使用ArrayController和TableView插入/修改NSManagedObject

时间:2010-10-13 11:57:59

标签: cocoa

我的应用程序使用Core Data和一个带有两个实体的简单模型,“Category”和“Item”,两者都带有'name'属性和一对多的关系(一个类别有很多项)。

在IB中,我有一个tableview和一个数组控制器。还有一个textfield和一个comboBox(用于用户类型项目名称和选择一个类别)和“添加”按钮。

我想要的是添加一个新项目并使用用户的项目名称和类别选择进行修改。

我试过这个:

- (IBAction)add:sender
{
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *itemEntityDescription = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:moc];

    NSManagedObject *newItem = [[NSManagedObject alloc] initWithEntity: itemEntityDescription insertIntoManagedObjectContext:moc];

    //Modify attribute
    [newItem setValue:[textField stringValue] forKey:@"name"];

    //Setup category relacionship from user selection on comboBox
    NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:moc];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name LIKE[c] %@)",[comboBox objectValueOfSelectedItem]];

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:categoryEntity];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *array = [moc executeFetchRequest:request error:&error];

    [newItem setValue:[array objectAtIndex:0] forKey:@"category"];
}

问题是TableView中未选择新项。如果我使用[itemsArrayController add:nil];,我无法访问新项目来修改它。

任何解决方案?提前致谢。

1 个答案:

答案 0 :(得分:1)

问题是阵列控制器没有时间根据您的MOC更改获取其新内容。这通常发生在未来(可能是下一次)通过运行循环的行程中,因为观察到MOC的变化。

如果要在阵列控制器的选择中使用新插入的对象,则必须强制阵列控制器刷新其内容。要做到这一点,只需发送数组控制器a -fetch:完成操作后,就应该出现新插入的对象。然后,您可以直接修改阵列控制器的选择。