1

我有一个应用程序,我试图在其中选择程序所依赖的资源(建筑物、IT 系统)。Entities之间的关系是Resource.resourceusedonprog<<--->Programme.usesresource。数据模型的一部分在这里: 模型切片

我正在尝试在特定程序使用哪些资源的 UITableViewController 上使用多个复选标记选择。但是,当我尝试与表中的资源单元格交互时,应用程序崩溃并出现错误

CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的一个错误。ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet。与用户信息(空)

我的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Resource Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    Resource *resource = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSString *fullname = [NSString stringWithFormat:@"%@ %@", resource.hasmanager.firstname, resource.hasmanager.surname];
    cell.textLabel.text = resource.name;
    cell.detailTextLabel.text = fullname;

    if (resource.resourceusedonprog == selectedProgramme){ cell.accessoryType = UITableViewCellAccessoryCheckmark;}
    else {cell.accessoryType = UITableViewCellAccessoryNone;}
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
     Resource *resource = [self.fetchedResultsController objectAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        resource.resourceusedonprog = NULL;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        resource.resourceusedonprog = selectedProgramme;

        }    }

该错误似乎是由 resource.resourceusedonprog = selectedProgramme; 和resource.resourceusedonprog = NULL;事件。如果我将它们注释掉,我可以检查和取消选中单元格(但显然,不要更改 resource.resourceusedonprog 的状态,即我想要实现的目标)。

4

1 回答 1

1

我找到了答案,这是基于两个问题。首先,对于多对多关系,关系键是一个 NSSet,而不是对象。其次,每个实体的 NSManagedObject 子类会自动为每个关系生成添加和删除方法。在这个我已经实施的情况下

[resource removeResourceusedonprogObject:selectedProgramme];

[resource addResourceusedonprogObject:selectedProgramme];

整体代码在这里:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Resource Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    Resource *resource = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSString *fullname = [NSString stringWithFormat:@"%@ %@", resource.hasmanager.firstname, resource.hasmanager.surname];
    cell.textLabel.text = resource.name;
    cell.detailTextLabel.text = fullname;

    if ([resource.resourceusedonprog containsObject:selectedProgramme]){ cell.accessoryType = UITableViewCellAccessoryCheckmark;}
    else {cell.accessoryType = UITableViewCellAccessoryNone;}
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
     Resource *resource = [self.fetchedResultsController objectAtIndexPath:path];
     NSLog(@"selectedResource is: %@", resource.name);
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [resource removeResourceusedonprogObject:selectedProgramme];
        } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
            [resource addResourceusedonprogObject:selectedProgramme];


        }    }
于 2013-05-03T09:54:11.930 回答