Question

J'ai un NSCollectionView lié à un NSArrayController. Je veux glisser-déposer de travail, donc je crée un délégué et mettre en œuvre les méthodes

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

Je retourne OUI pour les deux méthodes booléennes, NSDragOperationMove pour la validateDrop: méthode et un tableau vide pour la namesOfPromisedFilesDroppedAtDestination: méthode. J'ai aussi une déclaration NSLog comme la première ligne de chaque méthode afin que je puisse voir quand ils s'appellent.

En ce moment, la seule méthode qui est appelée est canDragItemsAtIndexes: (où je retourne OUI). Je vois qu'il est appelé, mais tout simplement en faisant glisser plus MODIFIE la sélection. Le reste ne s'appelle.

Si je fais le NSCollectionView pas en charge les sélections, alors même pas cette méthode est appelée.

Je suis sûr que je manque quelque chose de super évident, mais je ne peux pas comprendre ce qu'elle est. Quelqu'un at-il obtenu le glisser-déposer de travailler avec NSCollectionViews et peut faire la lumière?

Était-ce utile?

La solution

Je pense que vous manquez la partie où vous écrivez le contenu de glisser à la table de montage.
Pour prendre en charge le glisser-déposer, vous devez effectuer les étapes suivantes:

  1. Déterminez si vous pouvez faire glisser dans votre source de glisser
  2. Si YES, écrire le contenu de la table de montage
  3. Valider et accepter les éléments de votre cible de dépôt

L'écriture à la table de montage doit être mis en œuvre
- collectionView:writeItemsAtIndexes:toPasteboard:

Vous devez également enregistrer vos types glissés avec - registerForDraggedTypes:

Certains code échantillon: http://developer.apple.com/library/mac/ # SampleCode / iconcollection / introduction / intro.html

Autres conseils

Ce code a tout ce qu'il faut pour faire glisser une image d'un NSCollectionView à l'autre. Ceci était Figuring pas super évident. Sélectionnable est vérifié pour la vue de la collecte de source et câblé pour la source de données et points de vente délégués, mais je ne l'ai pas besoin 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
    }
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top