2016-07-19 5 views
0

私の無能さには申し訳ありませんが、私はココア、スウィフト、オブジェクト指向プログラミングの方が一般的です。私の主な情報源は、Cocoa Programming for OS X(5th ed。)、Appleの専門用語とObjective-C-riddled Developerページです。しかし、私はこの問題に言及していることは見ていない(または見たことがない)ため、ここにいる。別のIBカスタムビューでmouseEntered/-Exitedを使用して1つのIBカスタムビューを制御する方法

IB作成のカスタムビュー、LeftViewの内容を、別のIB作成のカスタムビューRightViewのmouseEntered/-Exitedアクションで変更したい。両方が同じウィンドウにあります。私は物事を理解しようとするが、無駄におもちゃのプログラムを作成しました。ここで

は(LeftViewを変更することになっている)RightViewのためのクラス定義です:

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

そして、ここでは(RightViewによって変更されることになっている)LeftViewのためのクラス定義です:

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

私は何か「完全に明白」を欠いていると確信していますが、私はちょっと密度があります。あなたがcode/xibファイルを修正する方法を私に教えることができれば、私は非常に感謝しています。あなたが子供と話すときのように説明することができれば、私はさらに感謝します。私が世界を引き継ぐとき(私はすべてに無能ではない)、私はあなたの親切を覚えています。

答えて

0

以前の戦略よりはるかに簡単な回避策が出てきました。 1つのカスタムビューでmouseEntered/-Exitedアクションを使用する代わりに、別のカスタムビューで表示されるものを制御しようとすると、mouseEntered/-Exitedコードを制御したいビューに置き、次にrect:の位置を変更しました。 NSTrackingArea

このアプローチでコードを移動する前に、NSTrackingAreaowner:LeftView()に変更し、mouseEntered/-Exitedコードを移動してみました。それは多くの恐ろしいエラーメッセージ(ここで話をしている純粋な初心者)を生み出したので、私はそれをあきらめました。しかし、self以外の所有者をどのように正しく割り当てることができるかを知っておくとよいでしょう。

いずれにしても、それ以上の考えや洞察は認められるでしょう。

関連する問題