谁能告诉我如何将位置X和Y返回到我的WindowController NSTextField(testTextX和testTextY)?

我以编程方式创建了windowController,NSImage和NSTextField。我向NSView添加了一个图像“点”,并希望该“点”图像可拖动并返回位置X和Y。

我设法添加了图像并使其可拖动,但是我不知道如何将mouseDragged的位置X和Y传递回WindowController的NSTextField(testTextX和testTextY)?

当前显示如下,当单击“点”图像时,它可以拖动到任何位置。

拖动图像时,我可以从NSImageView func mouseDragged(theEvent: NSEvent)打印位置X和Y。

我被困在如何将位置X和Y返回给WindowController。

swift - NSImageView mouseDragged值传递回windowController-LMLPHP
我的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)
    }
}

最佳答案

好的,我找到了解决方案。

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" {

    }
}

关于swift - NSImageView mouseDragged值传递回windowController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35831218/

10-10 23:30