2011-01-13 4 views
3

NSTableView에 대해 매우 기본적인 끌어서 놓기를 설정하려고합니다. 테이블 뷰에는 사용자 정의 셀이있는 단일 열이 있습니다. 열은 NSArrayController에 바인딩되며 배열 컨트롤러의 내용 배열은 내 컨트롤러 객체의 NSArray에 바인딩됩니다. 데이터가 테이블에 잘 표시됩니다. 나는 내 컨트롤러 개체 테이블 뷰의 dataSourcedelegate 콘센트에 연결 한 다음 이러한 방법으로 구현 :NSTableView 끌어서 놓기가 작동하지 않습니다.

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard 
{ 
    NSLog(@"dragging"); 
    return YES; 
} 

- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op 
{ 
    return NSDragOperationEvery; 
} 

- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info 
       row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation 
{ 
    return YES; 
} 

가 나는 또한 -awakeFromNib에 드래그 유형을 등록 :

#define MyDragType @"MyDragType" 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [_myTable registerForDraggedTypes:[NSArray arrayWithObjects:MyDragType, nil]]; 
} 

문제가 있다는 것입니다을 -tableView : writeRowsWithIndexes : toPasteboard : 메서드는 을 호출하지 않습니다. 나는 많은 예제들을 쳐다 보았고 내가 잘못하고있는 것을 알아 내지 못한다. 문제는 내가 사용자 지정 셀을 사용하고 있다는 것입니까? 이 기능을 사용하려면 셀 하위 클래스에서 재정의해야하는 것이 있습니까?

편집 : 확인 됨. 일반 NSTextFieldCell에 대한 사용자 정의 셀을 전환하면 드래그 작업이 수행됩니다. 자, 내 사용자 정의 셀을 사용하여 드래그 앤 드롭 작업을 수행하는 방법?

+0

'NSTableview'의 데이터 소스를 디버깅하고 위임 한 멤버가 예상대로 연결 되었습니까 * 체크 * 했습니까? – cacau

+0

2011 년부터의 질문입니다. 이후이 문제를 해결했습니다 : http://stackoverflow.com/a/4676823/153112. – indragie

답변

2

문제가 해결되었습니다. 테이블 뷰에서 맞춤 NSCell을 사용하여 바인딩을 사용하는 데 문제가있는 것으로 보입니다. 바인딩이 아닌 전통적인 NSTableViewDataSource 방법으로 전환하고 어레이 컨트롤러가이를 해결했습니다.

+0

전통적인 NSTableViewDataSource로 전환한다는 것은 맞춤 NSCell을 사용하지 않는다는 의미입니까? –

+0

아니요, 단지 바인딩을 사용할 수 없다는 것을 의미합니다. 당신은 여전히 ​​사용자 정의 셀을 사용할 수 있습니다 – indragie

1

드래그를 시작하는 데 충분해야합니다. 위임 방법을 연결 했습니까?

+0

NSTableView 개체에서 데이터 원본 및 위임을 로깅하여 두 번 확인했습니다. 연결되어 있다고 긍정적입니다. 나는 그 문제를 알아낼 수 있었다. 텍스트 셀 및 드래그 작업을 위해 사용자 정의 셀을 전환했습니다. 드래그 앤 드롭을 사용하기 위해 NSCell 서브 클래스에해야 할 일이 있습니까? – indragie

+0

셀에 어떤 종류의 사용자 지정을 했습니까? 마우스 추적으로 관습을 다 했나요? –

0

이 문제가 발생하여 끌어서 놓기를 제대로 작동 시키려면 사용자 지정 셀을 NSActionCell이 아닌 NSCell으로 확장해야합니다. NSCell에 구현할 수있는 기능이있을 수 있습니다.이 기능을 사용하면 모두 작동하지만, NSActionCell으로 전환 한 후에는 더 이상 파지하지 않았습니다. 적어도 그것은 나를 위해 문제를 해결했다.

+1

나를 위해 작동하지 않았다 –

2

저에게 맞는 것은 내 사용자 정의 셀 (내 경우 init)의 초기화 프로그램 내에서 init 또는 initImageCell 대신 initTextCell을 호출하는 것입니다. 수퍼 클래스가 NSCell인지 NSActionCell인지는 중요하지 않습니다. 또한 나는 구속력이 있으며 끌기는 여전히 효과가 있습니다.

3

저도 같은 문제에 더 우아한 해결책을 찾아 벽에 내 머리를 두드리는 후, 나는이 건너 온 :

예를 들어 http://www.wooji-juice.com/blog/cocoa-10-bindings.html

, 지원하려는 경우 테이블에서 드래그 앤 드롭하면 데이터 소스를 설정해야합니다. 바인딩을 사용하여 실제 데이터를 제공하고 데이터 소스를 설정할 수 있으며 Cocoa는 tableView:writeRowsWithIndexes:toPasteboard을 처리해야합니다. 및 관련 메시지.

예프. 배열 컨트롤러에 모든 것을 가져온 경우 어레이 컨트롤러에서 필요한 드래그/드롭 기능을 구현 한 다음 테이블 뷰의 데이터 소스를 setDataSource:으로 배열 컨트롤러에 설정해야합니다.

+0

이것은 나를 위해 바른 대답, 감사합니다. 나는 어레이 컨트롤러라는 것을 정확히 가지고 있었다. 배열 컨트롤러 클래스를 데이터 소스로 사용하도록 표를 설정하면 끌어서 놓기가 작동하기 시작했습니다. –

0

나는 또한 비슷한 문제를 관찰, NStableView 드래그 & 드롭 작동하지 않습니다. 내 tableview에 4 열이 있고 그 중 두 개는 사용자 지정 셀입니다.맞춤 설정되지 않은 셀을 드래그해도 셀 구분 기호는 물론 맞춤 설정 셀을 사용하지 않아도 잘 작동합니다.

내 맞춤 셀이 문제를 일으키는 NSButtonCell에서 하위 클래스로 분류되었습니다. 제안 된대로 부모 클래스를 NSButtonCell에서 NSActionCell로 변경했습니다. 이제 끌기가 완벽하게 작동합니다.

NSActionCell과 마찬가지로 NSCell과 NSActionCell 모두에서 작동하지만 셀에 조치가 필요합니다.

0

문제가 발생했습니다. NSCell 하위 클래스가 있고 tableView:writeRowsWithIndexes:toPasteboard을 구현했으며 dataSource가 NSTableView에 대해 설정되었습니다. 끌면 작동하지 않습니다. 나는 사용자 정의 서브 클래스

self.type = NSTextCellType; 

내 초기화의 세포 유형을 설정하면

그럼 내가 끌어 얻을. 그렇지 않은 경우 기본값은 NSNullCellType이며 끌기가 작동하지 않습니다. 나는 다른 하위 클래스를 사용하여 작업을 수행하는 사람들을 추측하고 있습니다. 셀 유형이 다르므로 NSTextFieldCell이 작동합니다.