通过 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 可以正常工作以切换选中/未选中的单元格,但是当我尝试通过 didSelectRowAtIndexPath
将 selectedManagedObject
添加到 myArrayOfManagedObjects
时,我返回 nil。
通过didSelectRowAtIndexPath
将NSManagedObject
添加/删除到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
中选择NSManagedObject
s 并将它们添加到NSMutableArray
或从NSMutableArray
中删除以保存到磁盘。你的解决方案让我更进一步,但我得到了这个错误:`***由于未捕获的异常'NSRangeException'而终止应用程序,原因:'*** - [__NSArrayM objectAtIndex:]:空数组的索引1超出范围'`
嗯,这似乎很清楚,您正在尝试在空数组中的索引 1 处进行交互。当你的意思是保存到磁盘时,你的意思是写一个文件或者只是保存你的上下文/持久存储?
我计划保存selectedManagedObjects
的NSMutableArray
并将它们检索到不同的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 设备的通知?