내 NSOutlineView에서 끌어서 놓기를 구현하려고하지만 예제 코드, 자습서 또는 다른 상황에서 볼 수있는 질문이 내 상황에서 효과가없는 것 같습니다. NSTreeController 바인딩 된 해당 내용 가진 NSOutlineView 있습니다. 트리 컨트롤러의 Content Array는 동일한 유형의 자식 개체가있는 사용자 지정 개체의 NSMutableArray에 바인딩됩니다. 윤곽선보기에서는 계층의 모든 수준에서 개체를 추가 및 제거 할 수 있습니다. 여태까지는 그런대로 잘됐다.바인딩을 사용하여 NSOutlineView에서 끌어서 놓기를 구현하는 방법은 무엇입니까?
드래그 앤 드롭을 구현하기 위해 개요보기의 데이터 소스로 사용할 NSObject 서브 클래스를 만들었습니다. 스택 오버플로에서 찾은 샘플 코드와 게시물을 기반으로 몇 가지 방법을 구현했습니다. 드래그를 시작할 수는 있지만, 드롭 아웃 할 때 outlineView : acceptDrop : item : childIndex :가 호출되지만 childIndex :를 제외한 모든 값은 nil입니다. childIndex의 값은 배열 내의 드롭 위치의 인덱스를 알려주지 만, 계층 구조 내에서 어느 노드에 있는지는 알 수 없습니다.
dataSource를 완전히 구현하지 않았기 때문에 outlineView : acceptDrop : ...로 전달 된 다른 모든 값이 0으로 가정합니다.이 값만 드래그 앤 드롭 작업을 제어하는 데 사용됩니다. 드래그를 시작할 때 더 많은 판지 정보를 설정해야합니까? 드롭이 발생했을 때 어떤 노드인지 어떻게 알 수 있습니까? 왜 모든 값이 outlineView에 있습니다 : acceptDrop : ... nil? TNLDragController
- (void)awakeFromNib {
[self.titlesOutlineView registerForDraggedTypes:[NSArray arrayWithObject:@"Event"]];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard {
NSLog(@"starting a drag");
NSString *pasteBoardType = @"Event";
[pboard declareTypes:[NSArray arrayWithObject:pasteBoardType] owner:self];
return YES;
}
- (NSDragOperation)outlineView:(NSOutlineView *)outlineView
validateDrop:(id <NSDraggingInfo>)info
proposedItem:(id)item
proposedChildIndex:(NSInteger)index {
NSLog(@"validating a drag operation");
return NSDragOperationGeneric;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index {
NSLog(@"accepting drag operation");
//todo: move the object in the data model;
NSIndexPath *path = [self.treeController selectionIndexPath]; // these three values are nil too.
NSArray *objects = [self.treeController selectedObjects];
NSArray *nodes = [self.treeController selectedNodes];
return YES;
}
// This method gets called by the framework but the values from bindings are used instead
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return NULL;
}
/*
The following are implemented as stubs because they are required when
implementing an NSOutlineViewDataSource. Because we use bindings on the
table column these methods are never called. The NSLog statements have been
included to prove that these methods are not called.
*/
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
NSLog(@"numberOfChildrenOfItem");
return 1;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
NSLog(@"isItemExpandable");
return YES;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
NSLog(@"child of Item");
return NULL;
}
@end
바인딩을 사용하고 개요보기에 DnD를 구현하지 않았지만 테이블보기의 경우 배열 컨트롤러를 서브 클래스 화하고 DnD 메서드를 추가해야합니다. 'NSTreeController'를 하위 클래스로 만들면 같은 전략이 개요보기에서 작동 할 것입니다. 내 생각 엔 이미 만든 클래스에서 데이터 소스 메서드를 구현하는 것이 더 쉬울 것이라고 생각합니다. – Monolo