Domanda

Ho un NSCollectionView legato ad un NSArrayController. Voglio ottenere il drag and drop di lavoro, in modo da creare un delegato e implementare i metodi

-(BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent*)event
-(BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id < NSDraggingInfo >)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation
-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id < NSDraggingInfo >)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
-(NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes

Sto YES tornare per i due metodi BOOL, NSDragOperationMove per il validateDrop: metodo, ed un array vuoto per il namesOfPromisedFilesDroppedAtDestination: metodo. Ho anche una dichiarazione NSLog come la prima linea in ogni metodo così posso vedere quando vengono chiamati.

In questo momento, l'unico metodo che viene chiamato è canDragItemsAtIndexes: (dove torno YES). Vedo che viene chiamato, ma ogni ulteriore trascinamento appena modifica la selezione. Il resto non vengono mai chiamato.

Se faccio il NSCollectionView non supporta selezioni, quindi nemmeno che il metodo viene chiamato.

Sono sicuro che mi manca qualcosa di super ovvio, ma non riesco a capire di cosa si tratta. Qualcuno ha ottenuto il drag and drop di lavoro con NSCollectionViews e può far luce?

È stato utile?

Soluzione

Credo che ti manca la parte in cui si scrive il contenuto trascinare per tavolo di montaggio.
Per supportare il drag and drop è necessario eseguire le seguenti operazioni:

  1. Determinare se è possibile trascinare nella vostra fonte di trascinamento
  2. Se YES, scrivere il contenuto al cartone
  3. Convalida e accettare gli articoli nel tuo target di rilascio

La scrittura al tavolo di montaggio dovrebbe essere attuato in
- collectionView:writeItemsAtIndexes:toPasteboard:

È inoltre necessario registrare il tipo trascinato con - registerForDraggedTypes:

Alcuni codice di esempio: http://developer.apple.com/library/mac/ # SampleCode / IconCollection / Introduzione / intro.html

Altri suggerimenti

Questo codice ha tutto il necessario per trascinare un'immagine da un NSCollectionView ad un altro. Capire questo fuori non era super ovvio. Selezionabile viene controllato per la vista raccolta sorgente e cablata per le prese DataSource e dei delegati, ma non ho bisogno di registerForDraggedTypes.

class Window:NSWindow, NSComboBoxDelegate, NSTextFieldDelegate, NSDatePickerCellDelegate, NSTableViewDataSource, NSTableViewDelegate, MKMapViewDelegate, NSCollectionViewDataSource, NSCollectionViewDelegate, NSCollectionViewDelegateFlowLayout, NSTabViewDelegate, NSMenuDelegate, NSDraggingDestination { }

    func collectionView(collectionView: NSCollectionView, writeItemsAtIndexPaths indexPaths: Set<NSIndexPath>, toPasteboard pasteboard: NSPasteboard) -> Bool {
    let index = indexPaths.first!.item
    let url = webImageURLs[index]   // array of string URLs that parallels the collection view.
    NSPasteboard.generalPasteboard().clearContents()
    NSPasteboard.generalPasteboard().declareTypes([kUTTypeText as String, kUTTypeData as String], owner: nil)
    NSPasteboard.generalPasteboard().setString(url, forType: (kUTTypeText as String))
    NSPasteboard.generalPasteboard().setData(webImageData[index], forType: (kUTTypeData as String))
    return true
}

// Provide small version of image being dragged to accompany mouse cursor.
func collectionView(collectionView: NSCollectionView, draggingImageForItemsAtIndexPaths indexPaths: Set<NSIndexPath>, withEvent event: NSEvent, offset dragImageOffset: NSPointPointer) -> NSImage {
    let item = collectionView.itemAtIndex(indexPaths.first!.item)
    return (item?.imageView?.image)!.resizeImage(20, height: 20)
}

// Image is dropped on destination NSCollectionView.
func collectionView(collectionView: NSCollectionView, draggingSession session: NSDraggingSession, endedAtPoint screenPoint: NSPoint, dragOperation operation: NSDragOperation) {
    let pasteboardItem = NSPasteboard.generalPasteboard().pasteboardItems![0]
    let urlString = pasteboardItem.stringForType((kUTTypeText as String))
    let imageData = pasteboardItem.dataForType((kUTTypeData as String))

    // destinationImages is the data source for the destination collectionView. destinationImageURLs is used to keep track of the text urls.
    if urlString != nil {
        destinationImageURLs.insert(urlString!, atIndex: 0)
        destinationImages.insert(NSImage(data: imageData!)!, atIndex: 0)
        destinationCollectionView.reloadData()
        let selectionRect = self.favoritesCollectionView.frameForItemAtIndex(0)
        destinationCollectionView.scrollRectToVisible(selectionRect)
    }
}

extension NSImage {
    func resizeImage(width: CGFloat, height: CGFloat) -> NSImage {
        let img = NSImage(size: CGSizeMake(width, height))
        img.lockFocus()
        let ctx = NSGraphicsContext.currentContext()
        ctx?.imageInterpolation = .High
        drawInRect(NSRect(x: 0, y: 0, width: width, height: height), fromRect: NSRect(x: 0, y: 0, width: size.width, height: size.height), operation: .CompositeCopy, fraction: 1)
        img.unlockFocus()

        return img
    }
} 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top