2014-04-25 14 views
6

Sto cercando di implementare il trascinamento in NSCollectionView che consentirà di riordinare le celle in vista. Ho impostato il delegato e implementato i seguenti metodi:Esempio di trascinamento di NSCollectionView

-(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; 
} 

Non sono sicuro di come procedere ulteriormente. Con questo posso vedere che ora posso trascinare il singolo oggetto della raccolta, ma come posso creare lo Drop?

+0

ciao user88975, hai mai risolto il problema? Sto affrontando esattamente lo stesso problema e non riesco a trovare alcun aiuto. – JFS

risposta

6

Sono stati implementati solo i metodi delegati ma non c'è alcuna logica in alcuni dei metodi. Ad esempio, per trascinare intorno ad un insieme di elementi che vorrei aggiungere qui sotto logica:

-(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; 
} 

È inoltre necessario registrare la vista raccolta di trascinare tipo in awakefromnib come

[_myCollectionView registerForDraggedTypes:@[KL_DRAG_TYPE]]; 

E assicurarsi di aver impostato il vista raccolta come selezionabile.

+0

GoodSp33d, qual è il tipo 'KL_DRAG_TYPE' che non è valido in Swift 3? – JFS

+0

@JFS hai trovato la soluzione? – Irshad

+0

@Irshad, no, non sono ancora in grado di far funzionare l'azione di rilascio ... – JFS

0

In aggiunta a quanto descritto in precedenza da GoodSp33d, manca anche la funzione di delegato validate che è necessaria per accettare le gocce. In Swift questo è:

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

Annotare il valore di ritorno, NSDragOperation. Questo metodo dovrebbe contenere codice che determina con precisione il tipo di operazione di trascinamento da tentare e restituisce questo valore. Restituire la cosa sbagliata può portare a qualche bug piuttosto fastidioso.

Inoltre, per supportare questo tipo di operazione, la classe di layout della vista raccolta che si sta utilizzando deve supportare anche il trascinamento. Il layout del flusso dovrebbe essere pronto all'uso, ma se si utilizza un layout personalizzato potrebbe essere necessario adattarlo per supportare il trascinamento della selezione in modo che la vista di raccolta possa rilevare obiettivi di rilascio validi e determinare un indice adatto percorso per loro.

Problemi correlati