Core data 拖放;在CoreData对象的NSTableView中拖放重新排序不';行不通
我试图实现一个简单的表,在这个表中,我可以将对象父对象放入用户可定义的顺序中。我将parentTableView绑定到parentArrayController,并将sortDescriptor设置为键“order”。该表按“order”键的顺序显示父实体,一切正常。 如果我尝试将行拖放到新位置,则在将拖动的对象插入或添加到新位置的直线上会发生崩溃:Core data 拖放;在CoreData对象的NSTableView中拖放重新排序不';行不通,core-data,drag-and-drop,nstableview,Core Data,Drag And Drop,Nstableview,我试图实现一个简单的表,在这个表中,我可以将对象父对象放入用户可定义的顺序中。我将parentTableView绑定到parentArrayController,并将sortDescriptor设置为键“order”。该表按“order”键的顺序显示父实体,一切正常。 如果我尝试将行拖放到新位置,则在将拖动的对象插入或添加到新位置的直线上会发生崩溃: [self.parentArrayController insertObjects:draggedObjects atArrangedObject
[self.parentArrayController insertObjects:draggedObjects atArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(row, [draggedObjects count])]];
或
[self.parentArrayController添加对象:draggedObjects]
我做错了什么
以下是tableviewdelegate的代码:
@implementation parentTableViewDelegate
@synthesize parentTableView;
@synthesize parentArrayController;
-(id)init{
if (self = [super init]) {
self.parentSortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
// user interface preparation code
[parentTableView registerForDraggedTypes:[NSArray arrayWithObject:[self.parentArrayController entityName]]];
[parentTableView setDraggingSourceOperationMask:NSDragOperationMove forLocal:YES];
}
#pragma mark -
#pragma mark NSTableViewDataSource
- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pasteboard {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
[pasteboard declareTypes:[NSArray arrayWithObject:[self.parentArrayController entityName]] owner:self];
[pasteboard setData:data forType:[self.parentArrayController entityName]];
return YES;
}
- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op {
if ([info draggingSource] == parentTableView) {
if (op == NSTableViewDropOn)
[tv setDropRow:row dropOperation:NSTableViewDropAbove];
return NSDragOperationMove;
} else {
return NSDragOperationNone;
}
}
- (BOOL)tableView:(NSTableView *)aTableView
acceptDrop:(id <NSDraggingInfo>)info
row:(int)row
dropOperation:(NSTableViewDropOperation)operation {
// Get object indexes from paste board
NSData *data = [[info draggingPasteboard] dataForType:[self.parentArrayController entityName]];
NSIndexSet *rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (!rowIndexes) return NO;
if (aTableView == self.parentTableView) {
if ([info draggingSource] == self.parentTableView) {
NSMutableArray *draggedObjects = [NSMutableArray array];
[draggedObjects addObject:[[self.parentArrayController arrangedObjects] objectsAtIndexes:rowIndexes]];
[self.parentArrayController removeObjectsAtArrangedObjectIndexes:rowIndexes];
// Insert dragged objects at row
if (row < [[self.parentArrayController arrangedObjects]count]) {
[self.parentArrayController insertObjects:draggedObjects atArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(row, [draggedObjects count])]];
}
else {
[self.parentArrayController addObjects:draggedObjects];
}
// Re-order objects
int i;
for (i = 0; i < [[self.parentArrayController arrangedObjects] count]; i++) {
[[[self.parentArrayController arrangedObjects] objectAtIndex:i] setValue:[NSNumber numberWithInt:i] forKey:@"order"];
}
[self.parentArrayController rearrangeObjects];
return YES;
}
}
return NO;
}
@end
@实现parentTableViewDelegate
@综合父表视图;
@综合父阵列控制器;
-(id)init{
if(self=[super init]){
self.parentSortDescriptors=[NSArray array with object:[NSSortDescriptor sortdescriptor with key:@“order”升序:YES];
}
回归自我;
}
-(无效)从NIB中唤醒{
[超级awakeFromNib];
//用户界面准备代码
[parentTableView RegisterForDragedTypes:[NSArray arrayWithObject:[self.parentArrayController entityName]];
[parentTableView SetDragingSourceOperationMask:NSDragOperationMove for Local:是];
}
#布拉格标记-
#pragma mark NSTableViewDataSource
-(BOOL)tableView:(NSTableView*)带索引的电视写入程序:(NSIndexSet*)行索引到粘贴板:(NSPasteboard*)粘贴板{
NSData*data=[NSKeyedArchivedDataWithRootObject:rowIndexes];
[pasteboard declareTypes:[NSArray arrayWithObject:[self.parentArrayController entityName]]所有者:self];
[粘贴板设置数据:数据类型:[self.parentArrayController entityName]];
返回YES;
}
-(NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id)建议的信息row:(int)建议的行DropOperation:(NSTableViewDropOperation)op{
if([info draggingSource]==parentTableView){
如果(op==NSTableViewDropOn)
[tv setDropRow:row dropOperation:nStableViewDropOver];
返回NSDragOperationMove;
}否则{
返回nsdragooperationne;
}
}
-(BOOL)tableView:(NSTableView*)或tableView
acceptDrop:(id)信息
行:(int)行
dropOperation:(NSTableViewDropOperation)操作{
//从粘贴板获取对象索引
NSData*data=[[info draggingPasteboard]dataForType:[self.parentArrayController entityName]];
NSIndexSet*rowIndexes=[nsKeyedUnarchiveObjectWithData:data];
如果(!rowIndexes)返回否;
if(aTableView==self.parentTableView){
if([info draggingSource]==self.parentTableView){
NSMutableArray*draggedObjects=[NSMutableArray];
[draggedObjects添加对象:[[self.parentArrayController arrangedObjects]对象索引:行索引]];
[self.parentArrayController移除对象或安排对象索引:行索引];
//在第行插入拖动的对象
如果(行<[[self.parentArrayController arrangedObjects]计数]){
[self.parentArrayController插入对象:draggedObjects或ArrangeDobjectIndex:[NSIndexSet IndexSetWithindexInRange:NSMakeRange(行,[draggedObjects计数])];
}
否则{
[self.parentArrayController添加对象:draggedObjects];
}
//重新排序对象
int i;
对于(i=0;i<[self.parentArrayController arrangedObjects]计数];i++){
[[[self.parentArrayController arrangedObjects]objectAtIndex:i]setValue:[NSNumber numberwhithint:i]forKey:@“order”];
}
[self.parentArrayController对象];
返回YES;
}
}
返回否;
}
@结束
下面是崩溃:
[<__NSArrayI 0x101b197b0> addObserver:forKeyPath:options:context:] is not supported. Key path: order
2012-10-22 08:52:40.630 OrderedSetTest[29950:303] (
0 CoreFoundation 0x00007fff89e570a6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8dfa33f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff89e56e7c +[NSException raise:format:] + 204
3 Foundation 0x00007fff8f0f7287 -[NSArray(NSKeyValueObserverRegistration) addObserver:forKeyPath:options:context:] + 76
4 AppKit 0x00007fff8c622eea -[_NSModelObservingTracker _registerOrUnregister:observerNotificationsForModelObject:] + 200
5 AppKit 0x00007fff8c622c18 -[_NSModelObservingTracker startObservingModelObjectAtReferenceIndex:] + 177
6 AppKit 0x00007fff8c70df7d -[NSArrayController _insertObject:atArrangedObjectIndex:objectHandler:] + 593
7 OrderedSetTest 0x0000000100004bbf -[parentTableViewDelegate tableView:acceptDrop:row:dropOperation:] + 1263
8 AppKit 0x00007fff8c9baa0e -[NSTableView performDragOperation:] + 215
9 AppKit 0x00007fff8c8079bf NSCoreDragReceiveMessageProc + 1651
10 HIServices 0x00007fff8b82046a DoMultipartDropMessage + 301
11 HIServices 0x00007fff8b820135 DoDropMessage + 49
12 HIServices 0x00007fff8b8200d7 SendDropMessage + 41
13 HIServices 0x00007fff8b8237c8 DragInApplication + 654
14 HIServices 0x00007fff8b822c69 CoreDragStartDragging + 519
15 AppKit 0x00007fff8c808190 -[NSCoreDragManager _dragUntilMouseUp:accepted:] + 881
16 AppKit 0x00007fff8c8094ba -[NSCoreDragManager dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:] + 1455
17 AppKit 0x00007fff8cab9040 -[NSWindow(NSDrag) dragImage:at:offset:event:pasteboard:source:slideBack:] + 133
18 AppKit 0x00007fff8c9b91e0 -[NSTableView _doImageDragUsingRowsWithIndexes:event:pasteboard:source:slideBack:startRow:] + 570
19 AppKit 0x00007fff8c9ba11d -[NSTableView _performClassicDragOfIndexes:hitRow:event:] + 358
20 AppKit 0x00007fff8c9ba391 -[NSTableView _performDragFromMouseDown:] + 509
21 AppKit 0x00007fff8c9ac4b2 -[NSTableView mouseDown:] + 707
22 AppKit 0x00007fff8c59b60e -[NSWindow sendEvent:] + 6853
23 AppKit 0x00007fff8c597744 -[NSApplication sendEvent:] + 5761
24 AppKit 0x00007fff8c4ad2fa -[NSApplication run] + 636
25 AppKit 0x00007fff8c451cb6 NSApplicationMain + 869
26 OrderedSetTest 0x0000000100001da2 main + 34
27 OrderedSetTest 0x0000000100001d74 start + 52
不支持[addObserver:forKeyPath:options:context:]。关键路径:顺序
2012-10-22 08:52:40.630订单设置测试[29950:303](
0 CoreFoundation 0x00007fff89e570a6例外预处理+198
1 libobjc.A.dylib 0x00007fff8dfa33f0 objc_异常_抛出+43
2 CoreFoundation 0x00007fff89e56e7c+[N异常提升:格式:][204
3基金会0x000 7FFF8F0F787- [ NSCORE(NSKEY ValueBoServer RealCub)Advestor:FrKePoe:选项:上下文:] + 76
4应用套件0x00007fff8c622eea-[\u NSModelObservingTracker\u寄存器运行寄存器:ObserverNotificationsForModeObject:+200
5应用套件0x00007fff8c622c18-[\n模型观察服务跟踪器开始服务模型对象参考索引:][177
6 AppKit 0x00007fff8c70df7d-[NSArrayController\u insertObject:atArrangedObjectIndex:objectHandler:+593
7 OrderedSetTest 0x0000000100004bbf-[parentTableViewDelegate tableView:acceptDrop:row:dropOperation:+1263
8应用套件0x00007fff8c9baa0e-[NSTableView性能测试操作:]+215
9应用套件0x00007fff8c8079bf NSCoreDragReceiveMessageProc+1651
10 HIServices 0x00007fff8b82046a域多部分DropMessage+301
11 HIServices 0x00007fff8b820135 DoDropMessage+49
12 HIServices 0x00007fff8b8200d7 SendDropMessage+41
13 HIServices 0x00007fff8b8237c8绘图应用程序+654
14 HIServices 0x00007fff8b822c69 CoreDragStartDraging+519
15应用套件0x00007fff8c808190-[NSCoreDragManager\u dragUntilMouseUp:接受:][881
16 AppKit 0x00007fff8c8094ba-[NSCoreDragManager绘图工具:fromWindow:at:offset:event:pasteboard:source:slideBack:+1455
17 AppKit 0x00007fff8cab9040-[NSWindow(NSDrag)绘图:在:偏移量:事件:粘贴板:源:幻灯片回退:][133
18应用套件0x00007fff8c9b91e0-[NSTableView\u doImageDragUsingRowsWi
#import "GFParentTableViewDelegate.h"
@implementation GFParentTableViewDelegate
-(id)init{
if (self = [super init]) {
self.parentSortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
[self.parentTableView registerForDraggedTypes:[NSArray arrayWithObject:[self.parentArrayController entityName]]];
[self.parentTableView setDraggingSourceOperationMask:NSDragOperationMove forLocal:YES];
}
#pragma mark -
#pragma mark NSTableViewDataSource
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard{
// Get array controller
NSDictionary *bindingInfo = [tableView infoForBinding:NSContentBinding];
NSArrayController *arrayController = [bindingInfo valueForKey:NSObservedObjectKey];
if (!arrayController) {
return NO;
}
[pboard declareTypes:[NSArray arrayWithObject:[arrayController entityName]] owner:self];
// Collect URI representation of managed objects
NSMutableArray *objectURIs = [NSMutableArray array];
for (id objProxy in [[arrayController arrangedObjects] objectsAtIndexes:rowIndexes]) {
[objectURIs addObject:[[objProxy objectID] URIRepresentation]];
}
// Set them to paste board
[pboard setData:[NSArchiver archivedDataWithRootObject:objectURIs] forType:[arrayController entityName]];
NSLog(@"Wrote %ld objects of type: %@ to Pasteboard",[objectURIs count],[arrayController entityName]);
return YES;
}
- (NSDragOperation)tableView:(NSTableView*)tableView
validateDrop:(id <NSDraggingInfo>)info
proposedRow:(NSInteger)row
proposedDropOperation:(NSTableViewDropOperation)dropOperation {
if ([info draggingSource] == self.parentTableView) {
if (dropOperation == NSTableViewDropOn){
[tableView setDropRow:row dropOperation:NSTableViewDropAbove];
}
return NSDragOperationMove;
} else {
return NSDragOperationNone;
}
}
- (BOOL)tableView:(NSTableView *)tableView
acceptDrop:(id <NSDraggingInfo>)info
row:(NSInteger)row
dropOperation:(NSTableViewDropOperation)operation {
// Get array controller
NSDictionary *bindingInfo = [tableView infoForBinding:@"content"];
NSArrayController *arrayController = [bindingInfo valueForKey:NSObservedObjectKey];
// Get object URIs from paste board
NSData *data = [[info draggingPasteboard] dataForType:[arrayController entityName]];
NSArray *objectURIs = [NSUnarchiver unarchiveObjectWithData:data];
if (!objectURIs) return NO;
// Get managed object context and persistent store coordinator
NSManagedObjectContext *context = [[NSApp delegate] managedObjectContext];
NSPersistentStoreCoordinator *coordinator = [context persistentStoreCoordinator];
// Collect manged objects with URIs
NSMutableArray *draggedObjects = [NSMutableArray array];
for (NSURL* objectURI in objectURIs) {
// Get managed object
NSManagedObjectID* objectID;
NSManagedObject* object;
objectID = [coordinator managedObjectIDForURIRepresentation:objectURI];
object = [context objectWithID:objectID];
if (!object) continue;
[draggedObjects addObject:object];
}
// Get managed objects
NSMutableArray *allObjects = [NSMutableArray arrayWithArray:[arrayController arrangedObjects]];;
if (!allObjects || [allObjects count] == 0) return NO;
// Replace dragged objects with null objects as placeholder to prevent old order
for (NSManagedObject *obj in draggedObjects) {
NSUInteger index = [allOobjects indexOfObject:obj];
if (index == NSNotFound) {
continue;
}
[allObjects replaceObjectAtIndex:index withObject:[NSNull null]];
}
// Insert dragged objects at row
if (row < [allObjects count]) {
[allObjects insertObjects:draggedObjects atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(row, [draggedObjects count])]];
}
else {
[allObjects addObjectsFromArray:draggedObjects];
}
// Remove old null objects
[allObjects removeObject:[NSNull null]];
// Re-order objects
int i;
for (i = 0; i < [allObjects count]; i++) {
NSManagedObject *object = [allObjects objectAtIndex:i];
[object setValue:[NSNumber numberWithInt:i] forKey:@"order"];
}
// Reload data
[arrayController rearrangeObjects];
return YES;
}
@end