2014-04-25 12 views
6

Próbuję zaimplementować przeciągnij kroplę w NSCollectionView, co pozwoli ponownie rozmieścić komórki w widoku. Ustawiłem delegata i zastosowałem poniższe metody:NSCollectionView Drag Drop przykład

-(BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard { 
    NSLog(@"Write Items at indexes : %@", indexes); 
    return YES; 
} 

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event { 
    NSLog(@"Can Drag"); 
    return YES; 
} 

- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id<NSDraggingInfo>)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation { 
    NSLog(@"Accept Drop"); 
    return YES; 
} 

-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id<NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation { 
    NSLog(@"Validate Drop"); 
    return NSDragOperationMove; 
} 

Nie jestem pewien, jak to zrobić dalej. Widzę teraz, że teraz mogę przeciągać pojedynczy przedmiot kolekcjonowania, ale jak mogę utworzyć Drop?

+0

cześć użytkownika88975, czy kiedykolwiek rozwiązałeś swój problem? Mam dokładnie ten sam problem i nie mogę znaleźć żadnej pomocy. – JFS

Odpowiedz

6

Zaimplementowano tylko metody delegatów, ale nie ma logiki w niektórych metodach. Na przykład, aby przeciągnąć wokół Collection poz Dodam poniżej logiki:

-(BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard { 
    NSData *indexData = [NSKeyedArchiver archivedDataWithRootObject:indexes]; 
    [pasteboard setDraggedTypes:@["my_drag_type_id"]]; 
    [pasteboard setData:indexData forType"@"my_drag_type_id"]; 
    // Here we temporarily store the index of the Cell, 
    // being dragged to pasteboard. 
    return YES; 
} 

- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id<NSDraggingInfo>)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation { 
    NSPasteboard *pBoard = [draggingInfo draggingPasteboard]; 
    NSData *indexData = [pBoard dataForType:@"my_drag_type_id"]; 
    NSIndexSet *indexes = [NSKeyedUnarchiver unarchiveObjectWithData:indexData]; 
    NSInteger draggedCell = [indexes firstIndex]; 
    // Now we know the Original Index (draggedCell) and the 
    // index of destination (index). Simply swap them in the collection view array. 
    return YES; 
} 

Trzeba także zarejestrować na stanowisku zbierania przeciągnąć typ w awakefromnib jak

[_myCollectionView registerForDraggedTypes:@[KL_DRAG_TYPE]]; 

I upewnij się, że zostało ustawione widok kolekcji jako dostępny do wybrania.

+0

GoodSp33d, jaki jest typ 'KL_DRAG_TYPE', nie jest poprawny w Swift 3? – JFS

+0

@JFS czy masz rozwiązanie? – Irshad

+0

@Irshad, nie, nadal nie mogę uruchomić akcji upuszczania ... – JFS

0

Oprócz tego, o czym wspomnia wyżej GoodSp33d, brakuje również funkcji delegowania validate, która jest wymagana do akceptowania zrzutów. W języku Swift jest to:

func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionViewDropOperation>) -> NSDragOperation 

Zwróć wartość zwracaną, NSDragOperation. Ta metoda powinna zawierać kod, który określa dokładnie, jakiego rodzaju operacja przeciągania jest podejmowana i zwraca tę wartość. Odesłanie niewłaściwej rzeczy może doprowadzić do dość irytujących błędów.

Co więcej, aby obsługiwać tego rodzaju operacje, używana klasa układu widoku kolekcji musi również obsługiwać funkcję przeciągania i upuszczania. Układ przepływu powinien zrobić to natychmiast, ale jeśli korzystasz z niestandardowego układu, może być konieczne dostosowanie go do obsługi przeciągania i upuszczania, aby widok kolekcji mógł wykryć prawidłowe miejsca upuszczania i określić odpowiedni indeks ścieżka dla nich.

Powiązane problemy