2010-03-10 5 views
3

Quel serait le moyen le plus simple ou le plus recommandé pour créer une colonne multiple NSOutlineView? Par défaut, il ne met en retrait que la colonne de contour; et pour autant que je sache, il n'y a pas de support intégré pour le faire indenter d'autres colonnes.Comment faire en sorte que NSOutlineView indente plusieurs colonnes?

J'ai une NSOutlineView qui montre une comparaison entre deux ensembles de données hiérarchiques. Pour l'attrait visuel, si un élément de la colonne de contour est en retrait, je voudrais mettre en retrait l'élément sur la même ligne dans une autre colonne du même montant d'indentation. (Il y a aussi une troisième colonne qui montre le résultat de la comparaison des deux éléments, cette colonne ne doit jamais être indentée.)

Est-ce que cela peut seulement être réalisé en sous-classant NSOutlineView? Et ce qui aurait besoin d'être remplacé dans la sous-classe? Ou existe-t-il un moyen plus simple de l'indenter en plusieurs colonnes?

Répondre

2

s'avère être plus facile que prévu. Voici un croquis de la solution. Pour mettre en retrait une colonne autre que la colonne de contour dans un NSOutlineView, vous pouvez:

  • Créer une sous-classe de la classe NSCell que vous utiliserez pour cette colonne, par exemple MYIndentedCell
  • Ajouter une variable d'instance indentation à MYIndentedCell, et fournir un mécanisme d'accès et un procédé de mutation de ce
  • neutralisation au moins drawWithFrame: inView: dans MYIndentedCell à:
 
    - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view 
    { 
     NSRect newFrame = frame; 
     newFrame.origin.x += indentation; 
     newFrame.size.width -= indentation; 
     [super drawWithFrame: newFrame inView: view]; 
    } 
  • Vous devez également remplacer et selectWithFrame:inView: similaire à ce qui précède, si la colonne sera modifiable
  • Remplacer cellSize à:
 
    - (NSSize) cellSize 
    { 
     NSSize cellSize = [super cellSize]; 
     cellSize.width += indentation; 
     return cellSize; 
    } 
  • Enfin, obtenir l'empreinte dans la colonne de suivre la L'indentation de la colonne de contour de NSOutlineView sera gérée par le délégué de la vue hiérarchique. Le délégué doit appliquer les mesures suivantes:
 
    - (void) outlineView: (NSOutlineView *) view 
       willDisplayCell: (id) cell 
       forTableColumn: (NSTableColumn *) column 
       item: (id) item 
    { 
     if (column == theColumnToBeIndented) { 
     [cell setIndentation: 
        [view indentationPerLevel] * [view levelForItem: item]]; 
     } 
    } 

Si vous rencontrez toujours des difficultés à le faire fonctionner, vous voudrez peut-être jeter un oeil à ImageAndTextCell.m dans Apple SourceView sample code que j'ai trouvé très utile pour comprendre comment faire ce qui précède.

Questions connexes