Question

J'ai un NSTableView et un NSOutlineView, tous deux avec leur contenu fourni par des liaisons, que j'aimerais avoir une fonctionnalité de glisser-déposer:

  • Faites glisser les lignes du tableau A sur une ligne de la structure B, où elles seront copiées dans une structure de données représentée par la ligne de la structure B.

  • Faites glisser une ligne du plan B sur une autre ligne du plan B, qui copiera les données représentées par la première ligne dans les données représentées dans la deuxième ligne.

J'ai lu la documentation "glisser-déposer" d'Apple et obtenu à peu près nulle part. Cela ne semble pas vraiment s'appliquer à ce que je dois faire. Qu'est-ce qui me manque?

Était-ce utile?

La solution

Vous avez besoin d'une source de données & # 8212; autant que je sache, vous ne pouvez pas y arriver uniquement avec les liaisons.

Le Créateur Adium Xtras inachevé, qui est sous licence BSD, inclut un contrôleur de matrice que vous pouvez définir en tant que source de données à utiliser pour effectuer un glisser-déposer dans un affichage table à base de liens .

Cette exigence peut ne pas s'appliquer à NSOutlineView et à NSTreeController. Je n'ai pas essayé ça.

Autres conseils

La page à laquelle vous avez accédé est assez claire sur ce que vous devez faire. Dans la source de données de la table A, implémentez registerForDraggedTypes: et tableView: writeRowsWithIndexes: toPasteboard: pour placer des données privées TableAPasteboardType sur la pâte.

Dans la source de données de contour B, implémentez les deux mêmes méthodes et insérez des données privées OutlineBPasteboardType dans le presse-papier.

Enfin, implémentez tableView: validateDrop: projetRow: projetDropOperation: et tableView: acceptDrop: rangée: dropOperation: pour vérifier si un TableAPasteboardType ou OutlineBPasteboardType et apportez les modifications appropriées à votre modèle lié, en fonction.

C'est assez simple une fois que vous venez de le faire et que vous le faites.

Sous MacOS 10.7, de nouveaux protocoles ont été ajoutés pour implémenter cette fonctionnalité.

Il existe un manque de documentation pour les tables pour le moment, mais vous pouvez trouver quelques exemples intéressants:

Pour NSTableViwew, le protocole NSTableViewDataSource définit les méthodes suivantes:

  • (BOOL) tableView: writeRowsWithIndexes: toPasteboard:
  • tableView: validateDrop: installedRow: installedDropOperation:
  • tableView: acceptDrop: ligne: dropOperation:

Pour NSOutlineView, le protocole NSOutlineViewDataSource définit les méthodes suivantes:

  • (BOOL) outlineView: writeItems: toPasteboard:
  • (NSDragOperation) outlineView: validateDrop: ProposéItem: ProposéChildIndex:
  • (BOOL) outlineView: acceptDrop: item: childIndex:

Il s'agit de la configuration minimale à implémenter pour chaque type de vue. Les cas d'utilisation sont assez similaires.

  1. Si la méthode toPasteboard: renvoie YES, le glissement commence.
  2. La méthode validateDrop: contrôle quel nœud cible est autorisé en mettant à jour le marqueur dans la vue
  3. Renvoie YES pour la méthode acceptDrop: si la suppression a abouti

Ceci conduit à deux cas d’usage secondaire que vous devez gérer. Le premier est un drag & amp; déposer dans la même vue ou la même opération entre deux vues. De plus, vous pouvez distinguer les opérations de déplacement, de copie ou de suppression. Un bon exemple est le fonctionnement des points d'arrêt avec drag & amp; déposer dans Xcode.

tableView propose des méthodes supplémentaires pour personnaliser drag & amp; déposer, mais ceux que j'ai mentionnés sont les méthodes clés pour le faire fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top