2016-07-19 1 views
0

Je suis désolée pour mon incompétence, mais je suis novice en matière de programmation orientée objet, Cocoa, Swift et en général. Mes premières sources ont été Cocoa Programming pour OS X (5ème édition), et les pages de jargon d'Apple et de développeur d'Objective-C-criblé. Mais je suis ici parce que je n'ai pas vu (ou je n'ai pas réalisé que j'ai vu) tout ce qui parle de ce problème. Je souhaite modifier le contenu d'une vue personnalisée créée par IB, LeftView, par des actions mouseEntered/-Exited dans une autre vue personnalisée créée par IB, RightView. Les deux sont dans la même fenêtre. J'ai créé un programme de jouets pour essayer de comprendre les choses, mais en vain.Comment contrôler une vue personnalisée IB avec mouseEntered/-Exited dans une autre vue personnalisée de l'IB

est ici la définition de classe pour RightView (qui est censé changer LeftView):

import Cocoa 

class RightView: NSView { 

    override func drawRect(dirtyRect: NSRect) { 
     // Nothing here, for now. 
    } 

    override func viewDidMoveToWindow() { 
     window?.acceptsMouseMovedEvents = true 

     let options: NSTrackingAreaOptions = 
      [.MouseEnteredAndExited, .ActiveAlways, .InVisibleRect] 

     let trackingArea = NSTrackingArea(rect: NSRect(), 
              options: options, 
              owner: self, 
              userInfo: nil) 
     addTrackingArea(trackingArea) 
    } 

    override func mouseEntered(theEvent: NSEvent) { 
     Swift.print("Mouse entered!") 
     LeftView().showStuff(true) 
    } 
    override func mouseExited(theEvent: NSEvent) { 
     Swift.print("Mouse exited!") 
     LeftView().showStuff(false) 
    } 
} 

Et voici la définition de classe pour LeftView (qui est censé être modifié par RightView):

import Cocoa 

class LeftView: NSView { 

    var value: Bool = false { 
     didSet { 
      needsDisplay = true 
      Swift.print("didSet happened and needsDisplay was \(needsDisplay)") 
     } 
    } 

    override func mouseUp(theEvent: NSEvent) { 
     showStuff(true) 
    } 
    override func drawRect(dirtyRect: NSRect) { 
     let backgroundColor = NSColor.blackColor() 
     backgroundColor.set() 
     NSBezierPath.fillRect(bounds) 

     Swift.print("drawRect was called when needsDisplay was \(needsDisplay)") 

     switch value { 
     case true: NSColor.greenColor().set() 
     case false: NSColor.redColor().set() 
     } 
     NSBezierPath.fillRect(NSRect(x: 40, y: 40, 
      width: bounds.width - 80, height: bounds.height - 80)) 
    } 

    func showStuff(showing: Bool) { 
     Swift.print("Trying to show? \(showing)") 
     value = showing 
    } 
} 

Je suis sûr qu'il me manque quelque chose "complètement évident", mais je suis un peu dense. Si vous pouviez me dire comment réparer les fichiers code/xib, je l'apprécierais beaucoup. Si vous pouviez expliquer des choses comme lorsque vous parlez à un enfant, je serais encore plus reconnaissant. Quand je prendrai le contrôle du monde (je ne suis pas incompétent pour tout), je me souviendrai de votre gentillesse.

Répondre

0

J'ai trouvé une solution de contournement qui est beaucoup plus simple que ma stratégie précédente. Au lieu d'avoir des actions mouseEntered/-Exited dans une vue personnalisée, essayez de contrôler ce qui est affiché dans une autre vue personnalisée, je mets simplement le code mouseEntered/-Exited dans la vue que je voulais contrôler, puis j'ai changé l'emplacement de rect:NSTrackingArea.

Avant de déplacer le code par pour cette approche, j'avais essayé de changer le owner: en NSTrackingArea en LeftView() et en déplaçant juste le mouseEntered/-Exited code. Cela a généré beaucoup de messages d'erreur effrayants (newbie naïf parle ici), alors j'ai abandonné. Il serait bon de savoir, cependant, comment on peut attribuer correctement un propriétaire autre que self.

Dans tous les cas, d'autres idées ou idées seraient appréciées.