2010-11-24 25 views
0

D'abord, je m'excuse pour la longueur, mais je veux m'assurer de recevoir suffisamment d'informations. J'ai un problème intéressant qui ne devrait vraiment pas être difficile. Je sais que si vous voulez avoir le défilement NSOutlineView à et que vous voulez afficher une ligne spécifique que vous utilisez simplement ce modèle:Obtenir NSOutlineView pour faire défiler jusqu'à la nouvelle entrée

NSInteger row = [self.myOutlineView rowForItem:myItem]; 
[self.myOutlineView scrollRowToVisible:row]; 

Je ne suis pas en utilisant un NSTreeController en faveur de l'utilisation de la délégation. J'utilise une classe de modèle d'adaptateur pour agir comme mes données. L'adaptateur enveloppe un certain nombre de types différents. Il est une structure simple:

[enfants adaptateur] ----- * [parent adaptateur]

Ainsi, l'adaptateur prend soin de traiter chaque enfant, peut ajouter, supprimer, peuvent se développer, etc. et agit également comme un objet de transport de données. Donc, avec tout cela à l'écart, voici le nœud du problème. Lorsque j'ajoute un nouvel élément à NSOutlineView, je commence par ajouter un nouvel adaptateur enfant à l'adaptateur sélectionné dans la vue hiérarchique. Puis-je recharger l'élément avec les enfants en utilisant:

[self.myOutlineView reloadItem:selectedAdapter reloadChildren:YES]; 

J'afficher alors la vue de cet objet et tenter de synchroniser le NSOutlineView de sorte que la ligne sélectionnée se rapporte à la nouvelle vue affichée. Donc, d'une manière simple les étapes sont les suivantes:

  1. chargement initial du NSOutlineView avec des données en utilisant le protocole NSOutlineDataSource
  2. L'utilisateur sélectionne un élément (adaptateur) qui peut ajouter des éléments enfants
  3. utilisateur clique sur le bouton « Ajouter »
  4. un nouvel objet est créé vide représenté
  5. le nouvel objet représenté est enveloppé dans un adaptateur
  6. l'adaptateur nouvellement créé est ajouté aux fils de l'adaptateur sélectionné
  7. Une nouvelle vue est créée en utilisant le nouvel objet représenté et affiché
  8. sélectionné noeud et ses enfants (parent) est rechargé dans le NSOutlineView
  9. La rangée nouvellement créée dans le NSOutlineView défile pour afficher qui synchronise la vue et la sélection du NSOutlineView

Voici donc le problème. NSOutlineView ne trouvera pas l'élément nouvellement ajouté si vous utilisez la méthode rowForItem. Pourtant, après avoir rechargé, je peux développer le nœud parent et sélectionner l'élément nouvellement ajouté et tout fonctionne bien. Pour tenter de résoudre le problème, j'ai développé le nœud parent par programmation (en exposant le nouvel élément), puis j'ai tenté de faire défiler le nouvel élément et il ne peut toujours pas trouver la ligne. RowForItem renvoie -1.

Ai-je manqué quelque chose lors de l'ajout d'un nouvel élément que je ne mets pas à jour quelque chose dans NSOutlineView? J'ai essayé beaucoup de choses différentes sans succès et toute aide sera grandement appréciée.

Merci à l'avance, Rob

Répondre

1

résolu mon propre problème ... enfin.

Étant donné que j'ajoutais mon premier enfant à ce noeud et qu'il passait de non extensible à extensible, il devait d'abord être étendu, puis faire défiler pour afficher, puis sélectionner l'élément. Plus de problème.