通过 didSelectRowAtIndexPath 添加 NSManagedObject 到 NSMutableArray
Adding an NSManagedObject to an NSMutableArray via didSelectRowAtIndexPath
我设置了一个 Core Data 项目,我有一个 NSFetchedResultsController
正常工作,NSPredicates
正常工作,现在我要对显示的数据做一些有用的事情屏幕。
现在,我的 UITableViewCellAccessory 可以正常工作以切换 checked/unchecked 单元格,但是当我尝试通过 [=18= 添加 selectedManagedObject
到 myArrayOfManagedObjects
时,我返回了一个 nil ].
通过 didSelectRowAtIndexPath
add/remove NSManagedObject
到 NSMutableArray
的正确方法是什么?
以下是相关属性:
@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];
我设置了一个 Core Data 项目,我有一个 NSFetchedResultsController
正常工作,NSPredicates
正常工作,现在我要对显示的数据做一些有用的事情屏幕。
现在,我的 UITableViewCellAccessory 可以正常工作以切换 checked/unchecked 单元格,但是当我尝试通过 [=18= 添加 selectedManagedObject
到 myArrayOfManagedObjects
时,我返回了一个 nil ].
通过 didSelectRowAtIndexPath
add/remove NSManagedObject
到 NSMutableArray
的正确方法是什么?
以下是相关属性:
@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];