2017-08-23 1 views
0

Je travaille avec swift 4 pour osx. J'ai une vue basée NSTableView avec 4 colonnes. les cellules dans chaque colonne a obtenu la même classe de cellules personnalisée:les boutons rapides d'unhide dans une colonne si la souris est sur la rangée

class CustomCell: NSTableCellView { 


    @IBOutlet weak var btnInfo: NSButton! 

    private var trackingArea: NSTrackingArea! 


    override func awakeFromNib() { 
     super.awakeFromNib() 

     self.trackingArea = NSTrackingArea(
      rect: bounds, 
      options: [.activeAlways, .mouseEnteredAndExited], 
      owner: self, 
      userInfo: nil 
     ) 
     addTrackingArea(trackingArea) 
    } 


    override func mouseEntered(with event: NSEvent) { 
     super.mouseEntered(with: event) 
      btnInfo.isHidden = false 
    } 

    override func mouseExited(with event: NSEvent) { 
     super.mouseExited(with: event) 
      btnInfo.isHidden = true 
    } 


} 

Maintenant, je voudrais réaliser la situation suivante:

si l'utilisateur va de pair avec la souris sur une ligne, la btnInfo devrait être visible et se cacher à nouveau, la souris quitte la rangée.

problème

est (avec le code ci-dessus), que mes accidents d'applications, car btnInfo sera nul

Logiquement: Parce que ce bouton est uniquement dans la colonne 4 disponibles. dans toutes les autres colonnes, il sera nul.

comment puis-je résoudre ce problème?

+0

Vous pouvez utiliser plusieurs vues de cellule de tableau. Renvoie cette vue de cellule pour la colonne 4 et renvoie la valeur par défaut - ou une autre vue de cellule personnalisée - pour les autres. – vadian

+1

Vous le faites au mauvais endroit. Ce n'est pas le travail de NSTableCellView car ce n'est pas un contrôleur. –

Répondre

0

La solution consiste à ajouter un NSTrackingArea à la vue entière, et non aux cellules individuelles. Ensuite, sur l'ensemble de la vue de la table, vous pouvez obtenir les événements de déplacement de la souris, prendre le de NSEvent. Puis NSTableView a une méthode row(at point: NSPoint) -> Int qui peut vous obtenir la ligne actuelle qui devrait être en surbrillance le bouton.