通过 didSelectRowAtIndexPath 将 NSManagedObject 添加到 NSMutableArray

Posted

技术标签:

【中文标题】通过 didSelectRowAtIndexPath 将 NSManagedObject 添加到 NSMutableArray【英文标题】:Adding an NSManagedObject to an NSMutableArray via didSelectRowAtIndexPath 【发布时间】:2015-04-29 14:01:12 【问题描述】:

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

现在,我的 UITableViewCellAccessory 可以正常工作以切换选中/未选中的单元格,但是当我尝试通过 didSelectRowAtIndexPathselectedManagedObject 添加到 myArrayOfManagedObjects 时,我返回 nil。

通过didSelectRowAtIndexPathNSManagedObject 添加/删除到NSMutableArray 的正确方法是什么?

以下是相关属性:

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

这是我的viewDidLoad,我想转储 `NSManagedObject's 的数组被实例化:

- (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];
    

【问题讨论】:

【参考方案1】:

我认为你的逻辑有问题。或者我不明白。

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

然后您选择并执行此操作:

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];

因为他们是参考,他们会找到它。

如果您正在修改构建 tableview 的同一数组的数据,那么您必须调用

[self.tableView reloadData];

查看新更新的表格视图

【讨论】:

tableView 显示来自fetchedResultsController 的内容。我正在尝试从tableView 中选择NSManagedObjects 并将它们添加到NSMutableArray 或从NSMutableArray 中删除以保存到磁盘。你的解决方案让我更进一步,但我得到了这个错误:`***由于未捕获的异常'NSRangeException'而终止应用程序,原因:'*** - [__NSArrayM objectAtIndex:]:空数组的索引1超出范围'` 嗯,这似乎很清楚,您正在尝试在空数组中的索引 1 处进行交互。当你的意思是保存到磁盘时,你的意思是写一个文件或者只是保存你的上下文/持久存储? 我计划保存selectedManagedObjectsNSMutableArray 并将它们检索到不同的viewController 好的,所以你只需要它们在另一个数组中,你需要做的很简单:在 didSelect 上,检查对象是否已经在数组中。如果是,删除它,如果不是,添加它。我建议您使用断点来查看它们是否正确添加到数组中,以及它们是否按应有的方式删除。异常究竟是什么时候发生的?另外,您能否使用新代码编辑您的帖子并在崩溃的行上发表评论?当您使用新信息完成所有操作时,请在此处通知我 :) 在您和 Aneeq Anwar 的帮助下,我弄明白了。我输入了addObject 部分,并将我的 selectedManagedObject 更改为:`self.selectedManagedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]` 它完美无缺。谢谢你们。【参考方案2】:

在可变数组中添加对象:

[self.myArrayOfManagedObjects addObject:obj];

用于从可变数组中删除对象:

[self.myArrayOfManagedObjects removeObject:obj];

【讨论】:

感谢您对此的帮助。在您的帮助下,我想出了我需要做些什么才能选择正确的“事物”。

以上是关于通过 didSelectRowAtIndexPath 将 NSManagedObject 添加到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?

下拉框多选框单选框 通过TagHelper绑定数据

酶:测试孩子通过安装渲染失败,但通过浅时通过

java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解

通过代码进行 Spring 配置与通过注释进行配置

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?