2016-07-19 6 views
0

Es tut mir leid für meine Inkompetenz, aber ich bin neu in Cocoa, Swift und objektorientierte Programmierung im Allgemeinen. Meine primären Quellen waren Cocoa Programming für OS X (5. Auflage) und Apples Jargon- und Objective-C-gespickte Entwicklerseiten. Aber ich bin hier, weil ich nichts gesehen habe (oder nicht bemerkt habe, dass ich etwas gesehen habe), das auf dieses Problem eingeht.So steuern Sie eine benutzerdefinierte IB-Ansicht mit mouseEntered/-Empfehlen in einer anderen benutzerdefinierten IB-Ansicht

Ich möchte den Inhalt einer IB-erstellten benutzerdefinierten Ansicht, LeftView, durch MouseEntered/-Exited Aktionen in einer anderen IB-erstellte benutzerdefinierte Ansicht, RightView ändern. Beide sind im selben Fenster. Ich habe ein Spielzeugprogramm erstellt, um zu versuchen, die Dinge herauszufinden, aber ohne Erfolg.

Hier ist die Klassendefinition für RightView (die LeftView soll sich ändern):

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) 
    } 
} 

Und für LeftView die Klassendefinition ist hier (die von RightView geändert werden soll):

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 
    } 
} 

Ich bin sicher, dass ich etwas "völlig offensichtlich" vermisse, aber ich bin ein wenig dicht. Wenn Sie mir sagen könnten, wie man die Code/Xib-Dateien repariert, würde ich es sehr schätzen. Wenn Sie Dinge wie im Gespräch mit einem Kind erklären könnten, wäre ich noch wertvoller. Wenn ich die Welt übernehme (ich bin nicht inkompetent in allem), werde ich mich an deine Freundlichkeit erinnern.

Antwort

0

Ich kam mit einem Workaround, der viel einfacher ist als meine vorherige Strategie. Anstatt mit mouseEntered/-Exited Aktionen in einer benutzerdefinierten Ansicht zu versuchen, zu steuern, was in einer anderen benutzerdefinierten Ansicht angezeigt wird, habe ich einfach den mouseEntered/-Exited-Code in die Ansicht eingefügt, die ich kontrollieren wollte, und dann den Speicherort von rect: in geändert NSTrackingArea.

Vor dem Verschieben von Code für diesen Ansatz hatte ich versucht, die owner: in NSTrackingArea zu LeftView() zu ändern und nur über die MausEntered/-Exited-Code zu bewegen. Das erzeugte viele beängstigende Fehlermeldungen (naive Anfänger sprechen hier), also gab ich es auf. Es wäre jedoch schön zu wissen, wie man einen anderen Besitzer als self richtig zuordnen kann.

In jedem Fall würden weitere Gedanken oder Einblicke geschätzt werden.

Verwandte Themen