Frage

Ich habe eine NSCollectionView, die an einen NsarrayController gebunden ist. Ich möchte Drag & Drop -Arbeiten bekommen, also erstelle ich einen Delegierten und implementieren Sie die Methoden

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

Ich kehre Ja für die beiden BOOL -Methoden zurück, nsDRagoperationMove für das Validatedrop: Methode und ein leeres Array für die namesofpromisedFilesDroppedatDestination: Methode. Ich habe auch eine NSLog -Anweisung als erste Zeile in jeder Methode, damit ich sehen kann, wann sie angerufen werden.

Derzeit ist die einzige Methode, die aufgerufen wird, CandragItemSatIndexes: (wo ich ja zurückkomme). Ich sehe, dass es aufgerufen wird, aber jedes weitere Ziehen verändert nur die Auswahl. Der Rest wird nie angerufen.

Wenn ich die NSCollectionView nicht unterstütze, wird die Auswahl nicht unterstützt, dann wird nicht einmal diese Methode aufgerufen.

Ich bin sicher, dass mir etwas super Offensichtliches fehlt, aber ich kann nicht herausfinden, was es ist. Hat jemand Drag & Drop -Arbeit mit NSCollectionViews bekommen und kann etwas Licht abgeben?

War es hilfreich?

Lösung

Ich denke, Sie vermissen den Teil, in dem Sie den Zieheninhalt auf das Pasteboard schreiben.
Um Drag & Drop zu unterstützen, müssen Sie die folgenden Schritte ausführen:

  1. Stellen Sie fest, ob Sie Ihre Drag -Quelle einziehen können
  2. Wenn YES, Schreiben Sie den Inhalt in das Pasteboard
  3. Überprüfen und akzeptieren Sie die Elemente in Ihrem Drop -Ziel

Das Schreiben in das Pasteboard sollte in implementiert werden in
- collectionView:writeItemsAtIndexes:toPasteboard:

Sie müssen auch Ihre gezogenen Typen registrieren - registerForDraggedTypes:

Ein Beispielcode:http://developer.apple.com/library/mac/#sampecode/iconcollection/Introction/intro.html

Andere Tipps

Dieser Code hat alles, was ich brauchte, um ein Bild von einem NSCollectionView in eine andere zu ziehen. Das herauszufinden war nicht super offensichtlich. Selyable wird auf die Quell -Sammlungsansicht überprüft und für die DataSource- und Delegierten -Outlets verkabelt, aber ich musste nicht registerfordRaggedTypes benötigt.

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
    }
} 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top