2017-02-19 2 views
0

끌어서 놓기 대리자 메서드를 사용하여 NSCollectionView 안에있는 항목을 이동하고 싶습니다. 아이템이 떨어질 때까지 작동합니다. 목적지 표시기 (갭)가 없으며 마우스를 놓을 때 아이템이 튀어 오릅니다. 대표단 validateDropacceptDrop은 절대 호출되지 않습니다. CollectionViewItems 사용자 정의 개체에서 데이터를 보여주고있다 : NSCollectionView 내부의 끌어서 놓기 예제

enter image description here

func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexPaths: Set<IndexPath>, with event: NSEvent) -> Bool { 

    print("canDragItem", indexPaths) 
    return true 
} 

func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool { 

    let indexData = Data(NSKeyedArchiver.archivedData(withRootObject: indexPaths)) 
    pasteboard.declareTypes(["my_drag_type_id"], owner: self) 
    pasteboard.setData(indexData, forType: "my_drag_type_id") 

    print("write data", indexData) 
    return true 
} 


func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndex proposedDropIndex: UnsafeMutablePointer<Int>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionViewDropOperation>) -> NSDragOperation { 

    print("validation") 
    return NSDragOperation.move 
} 

func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, index: Int, dropOperation: NSCollectionViewDropOperation) -> Bool { 

    let pb = NSPasteboard() 
    let indexData = (pb.data(forType: "my_drag_type_id"))! as Data 
    let indexPath = (NSKeyedUnarchiver.unarchiveObject(with: indexData)) as! IndexPath 
    let draggedCell = indexPath.item as Int 

    print("acceptDrop", draggedCell) 


    return true 
} 

는 도대체 ... 내가 대지에 드래그 할 수있는 항목 데이터를 쓰기에 문제가 무슨 생각. 어떤 제안.

+0

메소드의 선언을 확인하십시오. '경로'가 누락되었습니다. – Willeke

+0

@Willeke는 답변 해 주셔서 감사합니다. 그러나 무엇을 의미합니까? 어떤 경로가 누락 되었습니까? 감사! – JFS

+0

'validateDrop'와'acceptDrop' 함수가 올바른 매개 변수를 가지고 있지 않습니다. 새 버전에는'proposedIndexPath' 및'indexPath' 매개 변수가 있습니다. – Willeke

답변

0

이 문제의 가능한 원인은 두 가지입니다. 이 특정한 경우 Willeke의 응답은 정확합니다. 실제로 모든 드래그 앤 드롭 위임 함수의 이전 indexSet 버전을 사용할 수 있지만, 그렇다면 모두이 이전 버전이고 이전 버전과 새로운 버전이 혼합되어 있지 않은지 확인해야합니다. 당신의 canDragItems: 위임 기능이 indexPaths라는 매개 변수가있는 경우 짧은에서

, 다음 writeItemsAt:, validateDrop:acceptDrop: 기능도 IndexPaths하지 IndexSets의 사용을 확인합니다.

2 차적으로, 내 인스턴스에서 컬렉션보기가 감지 할 수있는 드래그 유형 (예 : viewDidLoad)에 대한 등록을 기억하고 있는지 확인하십시오. 아래 코드 스 니펫을 참조하십시오. 드래그 데이터를 생성 할 때 동일한 드래그 유형이 페이스트 보드에 설정됩니다!

collectionView.register(forDraggedTypes: [dragType])