拖放功能swift OSX

Tom*_*adi 6 macos xcode drag-and-drop swift

这有点复杂,但我希望有人可以帮助我.我正在尝试为我的OSX应用程序构建拖放功能.

在此输入图像描述

这就是目前的情况.因此,只有一个文本字段,用户可以在视图中拖放.只有一个文本字段就足够简单,但是如果有几个文本字段,那就变得复杂了,我不知道如何处理.这就是我目前拥有的:

@IBOutlet weak var test: NSTextField!

@IBAction override func mouseDragged(theEvent: NSEvent) {
    NSCursor.closedHandCursor().set()
    var event_location = theEvent.locationInWindow

    test.frame.origin.x = event_location.x - 192
    test.frame.origin.y = event_location.y
}
Run Code Online (Sandbox Code Playgroud)

Test是我的NSTextField的名称.我知道它的名字所以它很容易移动它.但是如果用户添加了更多的文本字段(参见左侧窗格),那么我不知道如何处理这个文本字段,因为我没有它的名字(如第一个输入的"test").

我通过以下代码添加文本字段:

    let input = NSTextField(frame: CGRectMake(width, height, 100, 22))
    self.MainView.addSubview(input)
Run Code Online (Sandbox Code Playgroud)

如何确定选择了哪个文本字段(如果视图中有多个文本字段),然后通过拖放移动相应的文本字段?

拖放适用于单个静态文本字段

Igo*_* B. 5

我已经准备了一个示例应用程序,因此请考虑以下问题:

https://github.com/melifaro-/DraggableNSTextFieldSample

这个想法是要介绍SelectableTextField继承NSTextFieldSelectableTextField提供了在文本字段选择事件上订阅感兴趣的侦听器的功能。它具有didSelectCallback块变量,您需要在此处设置处理代码。像这样:

textField.didSelectCallback = { (textField) in
    //this peace of code will be performed once mouse down event
    //was detected on the text field
    self.currentTextField = textField
}
Run Code Online (Sandbox Code Playgroud)

通过使用提到的回调机制,一旦选择了文本字段,我们就可以将其存储在currentTextField变量中。这样,当mouseDragged调用of函数时,ViewController我们就会意识到currentTextField并可以适当地对其进行处理。如果是示例应用,则需要currentTextField根据拖动事件移动来调整原点。希望它现在变得更好。

PS NSTextField已打开以继承它,因此您可以在使用NSTextField的任何地方(包括Interface Builder)自由使用我们的SelectableTextField。

编辑

我已经检查了您的样品。不幸的是,我无法将/ create pull request提交到您的存储库中,因此请在这里找到我的建议:

override func viewDidLoad() {
    super.viewDidLoad()

    didButtonSelectCallback = { (button) in

        if let currentButton = self.currentButton {

            currentButton.highlighted = !currentButton.highlighted

            if currentButton == button {
                self.currentButton = nil
            } else {
                self.currentButton = button
            }
        } else {
            self.currentButton = button
        }

        button.highlighted = !button.highlighted
    }

    addButtonAtRandomePlace()
    addButtonAtRandomePlace()

    didButtonSelectCallback(button: addButtonAtRandomePlace())
}

override func mouseDragged(theEvent: NSEvent) {

    guard let button = currentButton else {
        return
    }

    NSCursor.closedHandCursor().set()

    button.frame.origin.x += theEvent.deltaX
    button.frame.origin.y -= theEvent.deltaY
}

private func addButtonAtRandomePlace() -> SelectableButton {

    let viewWidth = self.view.bounds.size.width
    let viewHeight = self.view.bounds.size.height

    let x = CGFloat(rand() % Int32((viewWidth - ButtonWidth)))
    let y = CGFloat(rand() % Int32((viewHeight - ButtonHeight)))

    let button = SelectableButton(frame: CGRectMake(x, y, ButtonWidth, ButtonHeight))
    button.setButtonType(NSButtonType.ToggleButton)
    button.alignment = NSCenterTextAlignment
    button.bezelStyle = NSBezelStyle.RoundedBezelStyle
    button.didSelectCallback = didButtonSelectCallback
    self.view.addSubview(button)

    return button
}
Run Code Online (Sandbox Code Playgroud)