Objective c 由于异常而取消拖动';NSInvalidArgumentException';:尝试插入nil对象

Objective c 由于异常而取消拖动';NSInvalidArgumentException';:尝试插入nil对象,objective-c,macos,cocoa,Objective C,Macos,Cocoa,当我尝试将一个对象从一个NSOutlineView拖放到另一个对象时,它通常是有效的,但有时对某些对象会失败。我得到的信息是: *** Canceling drag because exception 'NSInvalidArgumentException' (reason '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]') was raised d

当我尝试将一个对象从一个
NSOutlineView
拖放到另一个对象时,它通常是有效的,但有时对某些对象会失败。我得到的信息是:

*** Canceling drag because exception 'NSInvalidArgumentException' (reason '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]') was raised during a dragging session
我发现,当我首先将项目拖到同一表格的另一行上(不释放它),然后拖到新表格上时,就会发生这种情况。

这是我在拖动过程中可以检查的最后一个函数中draggedItems的内容:

- (id <NSPasteboardWriting>)outlineView:(NSOutlineView *)outlineView pasteboardWriterForItem:(id)item
{
    CBCollectible *collectible = [item representedObject];
    return [[collectible UniqueID] stringValue];
}

- (void)outlineView:(NSOutlineView *)outlineView
    draggingSession:(NSDraggingSession *)session
       endedAtPoint:(NSPoint)screenPoint
          operation:(NSDragOperation)operation
{
    //CBDebug(@"end draggingLeaderIndex %i", session.draggingLeaderIndex);
}

- (void)outlineView:(NSOutlineView *)outlineView
    draggingSession:(NSDraggingSession *)session
   willBeginAtPoint:(NSPoint)screenPoint
           forItems:(NSArray *)draggedItems
{
    FreeAndNil(theDraggedItems);
    theDraggedItems = [[NSArray alloc] initWithArray:draggedItems];
    [session.draggingPasteboard setData:[NSData data] forType:MAIN_VIEW_PASTEBOARD_TYPE];
}

- (void)outlineView:(NSOutlineView *)outlineView
updateDraggingItemsForDrag:(id<NSDraggingInfo>)draggingInfo
{
}

日志
对象
在崩溃前的行上显示了什么?如果您可以发布实现拖动的代码,这将非常有用。@rebello95由于崩溃发生在拖放API中,我无法在崩溃前检查该行。但是我可以检查datasource函数中被拖动的项是什么-outlineView:DragingSession:willBeginAtPoint:forItems:。我复制了问题中的日志。@Nickkk哪个代码更精确?当拖动失败时,不会调用接收NSOutlineView的方法。因此,如果您愿意,我可以复制源outlineView的方法。但是当我在表中拖动一个对象时,它们工作得很好。请发布堆栈跟踪。
NSLog(@"draggedItems %@", draggedItems);
<__NSArrayM 0x31fa0f0>(
<NSTreeControllerTreeNode: 0x1d23750>, child nodes {}
)
[outlineView1 registerForDraggedTypes:@[MAIN_VIEW_PASTEBOARD_TYPE, NSStringPboardType, NSFilenamesPboardType]];
[outlineView2 registerForDraggedTypes:@[MAIN_VIEW_PASTEBOARD_TYPE, NSStringPboardType, NSFilenamesPboardType]];