通过 didSelectRowAtIndexPath 添加 NSManagedObject 到 NSMutableArray

Adding an NSManagedObject to an NSMutableArray via didSelectRowAtIndexPath

我设置了一个 Core Data 项目,我有一个 NSFetchedResultsController 正常工作,NSPredicates 正常工作,现在我要对显示的数据做一些有用的事情屏幕。

现在,我的 UITableViewCellAccessory 可以正常工作以切换 checked/unchecked 单元格,但是当我尝试通过 [=18= 添加 selectedManagedObjectmyArrayOfManagedObjects 时,我返回了一个 nil ].

通过 didSelectRowAtIndexPath add/remove NSManagedObjectNSMutableArray 的正确方法是什么?

以下是相关属性:

@property (nonatomic, strong) NSManagedObject *selectedManagedObject;
@property (nonatomic, strong) NSMutableArray *myArrayOfManagedObjects;

这是我的 viewDidLoad 我要转储 `NSManagedObject' 的数组被实例化的地方:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Standard Core Data Setup Stuff

    // Instantiate a list to store myArrayOfManagedObjects
    self.myArrayOfManagedObjects = [[NSMutableArray alloc]init];
}

这是我的 didSelectRowAtIndexPath

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        NSManagedObject *selectedManagedObject = self.selectedManagedObject;

        // Set the checkmark accessory for the selected row.
        // TODO: add the object to the array
        if ([tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryNone) {
            [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
            // ** My problem lives here
            [self.myArrayOfManagedObjects insertObject:self.selectedManagedObject atIndex:indexPath.row];
            NSLog(@"Added %@ to myArrayOfManagedObjectsArray", selectedManagedObject.myObjectDescription);
            NSLog(@"myArrayOfManagedObjects contains %@", self.myArrayOfManagedObjects);
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
        } else {
            [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];
            // ** My problem lives here
            [self.myArrayOfManagedObjects removeObjectAtIndex:indexPath.row];
            NSLog(@"Removed %@ from myArrayOfManagedObjectsArray", selectedManagedObject.myObjectDescription);
            NSLog(@"myArrayOfManagedObjects contains %@", self.myArrayOfManagedObjects);
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
        }
    }

更新:问题已解决

如果不清楚,我 tableView 上的东西来自 fetchedResultsController。我的任务是将其中的项目添加到我要保存的单独 NSMutableArray 中。这是它起作用的原因:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // ** Problem Solved: I needed to tell the compiler where my selectedManagedObject was
    self.selectedManagedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

    // Set the checkmark accessory for the selected row.
    if ([tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryNone) {
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
        [self.myArrayOfManagedObjects addObject:self.selectedManagedObject];
        NSLog(@"Added **%@** to myArrayOfManagedObjects", self.selectedManagedObject.description);
        NSLog(@"myArrayOfManagedObjects contains %lu objects", (unsigned long)[self.myArrayOfManagedObjects count]);
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    } else {
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];
        [self.myArrayOfManagedObjects removeObject:self.selectedManagedObject];
        NSLog(@"Removed **%@** from myManagedObjectArray", self.selectedManagedObject.description);
        NSLog(@"myArrayOfManagedObjects contains %lu objects", (unsigned long)[self.myArrayOfManagedObjects count]);
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

我认为您设置的逻辑有问题。或者我没看懂。

您有一个包含当前显示的所有对象的数组,对吗?这是self.myArrayofManagedObjects。我假设你是在别的地方填的,否则你不会问这个问题。

然后 select 并执行此操作:

NSManagedObject *selectedManagedObject = self.selectedManagedObject;

意味着(你肯定知道)你新实例化的 NSManagedObject 现在与你的 .h 中的实例相同,据我所知,它没有实例化。

所以你几乎在玩 nil 那一行之后的每一行。

你可能应该做的是:

NSManagedObject *selectedManagedObject = [self.myArrayOfManagedObjects objectAtIndex:indexPath.row];

self.selectedManagedObject = [self.myArrayOfManagedObjects objectAtIndex:indexPath.row];

现在您在对象数组中有了对正确对象的引用,可以开始操作它了。

据我所知,您想将该对象添加到某个数组或从中删除该对象,因此您只需添加或删除对新数组的引用即可。

[myArray addObject:OBJECT];
[myArray removeObject:OBJECT];

因为他们是推荐人,所以他们会找到它。

如果您要修改构建表视图的同一数组的数据,则必须调用

[self.tableView reloadData];

查看您新更新的表格视图

在可变数组中添加对象:

[self.myArrayOfManagedObjects addObject:obj];

从可变数组中删除对象:

[self.myArrayOfManagedObjects removeObject:obj];