2016-03-06 16 views
0

任何人都可以請示範我如何獲得位置X和Y回到我的WindowController NSTextField(testTextX和testTextY)?NSImageView mouseDragged值傳遞給windowController

我編程創建了一個windowController,NSImage和NSTextField。我添加了一個圖像「點」到NSView,並希望「點」圖像可拖動,並返回位置X和Y.

我管理圖像添加和拖動,但我不知道如何通過在我的WindowController(testTextX和testTextY)處將mouseDragged上的X和Y放回到NSTextField?

當前顯示如下,點擊「點」圖像時,可拖動到任意位置。

當拖動圖像時,我可以從NSImageView func mouseDragged(theEvent: NSEvent)中打印出位置X和Y.

我被困在如何將位置X和Y傳遞迴WindowController。

enter image description here 我WindowController.swift代碼如下:

public class MyWindowController: NSWindowController, NSWindowDelegate { 
    // MARK: Constants 
    // 1. Define min&max window size 
    var fWidth:CGFloat = 0 
    var fHeight:CGFloat = 0 
    var vWidth:CGFloat = 0 
    var vHeight:CGFloat = 0 
    var blankPage: NSView! 

    var viewDotImg: NSImageView! 
    var testTextX: NSTextField! 
    var testTextY: NSTextField! 

    var modalWinHeight: CGFloat = 0 
    var m_window:NSWindow = NSWindow() 

    // MARK: Initializer 
    init(){ 
     super.init(window: self.m_window) 
    } 

    init(channelId:Int){ 
     super.init(window:self.m_window) 

     // Get the window full width and height 
     fWidth = (NSScreen.mainScreen()?.frame.width)! 
     fHeight = (NSScreen.mainScreen()?.frame.height)! 

     // Get the window visible width and height 
     vWidth = (NSScreen.mainScreen()?.visibleFrame.width)! 
     vHeight = (NSScreen.mainScreen()?.visibleFrame.height)! 

     // Get the position X and Y for Window 
     let winPosX: CGFloat = fWidth - vWidth 
     let winPosY: CGFloat = fHeight - vHeight 

     // Divide the height by 3 
     let avgHeight: CGFloat = vHeight/3 

     // Set the max window height as avgHeight * 1.3 
     let modalWinHeight: CGFloat = avgHeight * 1.3 

     // Set the window frame 
     self.m_window = NSWindow(contentRect: NSMakeRect(winPosX, winPosY, vWidth, modalWinHeight), 
      styleMask: NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask, 
      backing: NSBackingStoreType.Buffered, `defer`: false); 

     // Window delegate 
     self.m_window.delegate = self 

     // Add a blank NSView with Gradian background colour 
     blankPage = CGradiantBlank(x: x, y:y, width:width, height: height) 
     self.window?.contentView = blankPage 

     // Add Image Dot to NSView 
     viewDotImg = DragNSImageView(x: 200, y: 200, width: 10, height: 10) 

     // Add Two TextField to NSView 
     testTextX = TextLabel(x: 200, y: 10, width: 100, height: 24, value: "100") 
     testTextY = TextLabel(x: 305, y: 10, width: 100, height: 24, value: "100") 

     blankPage.addSubview(viewDotImg) 
     blankPage.addSubview(testTextX) 
     blankPage.addSubview(testTextY) 
    } 

    func updTestXY(x:Double, y:Double){ 
     testTextX.stringValue = String(x) 
     testTextY.stringValue = String(y) 
    } 

    override public init(window: NSWindow?) { 
     super.init(window: window) 
    } 

    required public init?(coder:NSCoder){ 
     super.init(coder: coder) 
    }  
} 

我NSImageView代碼如下:

如下
public class DragNSImageView: NSImageView { 
    private var xWidth: CGFloat = 0 
    private var xHeight: CGFloat = 0 

    init(x:CGFloat, y:CGFloat, width:CGFloat, height:CGFloat, chId: Int) { 
     super.init(frame: NSRect(x: x,y: y,width: width,height: height)) 
     super.imageScaling = NSImageScaling.ScaleAxesIndependently 
     super.image = NSImage(named: "dot-10") 
     xWidth = width 
     xHeight = height 
    } 

    required public init?(coder: NSCoder) { 
     super.init(coder: coder) 
    } 

    override public func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
    } 

    public override func mouseDragged(theEvent: NSEvent) { 
     super.mouseDown(theEvent) 
     let location = theEvent.locationInWindow 
     let pX: CGFloat = location.x 
     let pY: CGFloat = location.y 
     super.frame = NSRect(x: pX,y: pY,width: xWidth,height: xHeight) 
     Swift.print("X: \(location.x)" Y: \(location.y)) 
     /* How to pass this location.x and location.y back to WindowController func updateTestXY()? 

     updTestXY(Double(location.x), y:Double(location.y)) 
     */ 
    } 
} 

我的NSTextField代碼:

public class TextLabel: NSTextField { 
    // MARK: Initializer 
    init(){ 
     super.init(frame: NSRect(x: 0, y: 0, width: 90, height: 10)) 
    } 

    convenience init(x:CGFloat, y:CGFloat, width:CGFloat, height:CGFloat, value:String){ 
     self.init() 
     super.wantsLayer = true 
     super.backgroundColor = NSColor.darkGrayColor() 
     super.textColor = NSColor.whiteColor() 
     super.stringValue = value 
     super.frame = NSRect(x: x, y: y, width: width, height: height) 
    } 

    required public init?(coder: NSCoder) { 
     super.init(coder: coder) 
    } 

    override public func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
    } 
} 

回答

0

好吧,我找到了解決方案。

let mainWindow = self.window?.windowController as! MyWindowController 
mainWindow.updXY(location.x, y:location.y, refName: refName) 

如果有多個 「點」 的形象,然後將下面的代碼添加到NSImageView的init()

super.identifier = "ReferenceName1" 

現在,到NSImageView mouseDragged(theEvent: NSEvent)方法並添加以下行:

let refName = super.identifier 

這將在MyWindowController中用於檢測調用指定函數時拖動哪個「點」圖像。在我的情況下,我打電話

updXY(location.x, y:location.y, refName: refName) 

所以,在MyWindowController中,我使用以下來完成這項工作。

public func updXy(x: CGFloat, y: CGFloat, refName: String){ 
    if refName == "ReferenceName1" { 

    }else if refName == "ReferenceName2" { 

    } 
}