2013-08-07 1 views
2

내 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 
+0

바인딩을 사용하고 개요보기에 DnD를 구현하지 않았지만 테이블보기의 경우 배열 컨트롤러를 서브 클래스 화하고 DnD 메서드를 추가해야합니다. 'NSTreeController'를 하위 클래스로 만들면 같은 전략이 개요보기에서 작동 할 것입니다. 내 생각 엔 이미 만든 클래스에서 데이터 소스 메서드를 구현하는 것이 더 쉬울 것이라고 생각합니다. – Monolo

답변

0

나는 사실 잘 일하는이 질문에 설명 구현 @implementation \, 이에하려고 할 때 나는 신인 실수를 : 여기에

는 아웃 라인 뷰 데이터 소스의 구현 그것이 작동하는지 확인하십시오. 메서드에 전달 된 값을 검사하기 위해 - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index에 중단 점을 설정했습니다. 나는 ARC를 사용하고 있으며 ARC가 디버거에서 사용할 수 없도록 값을 유지하지 않으므로 값이 메서드 내에서 참조되지 않았습니다!

관련 문제