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)
如何确定选择了哪个文本字段(如果视图中有多个文本字段),然后通过拖放移动相应的文本字段?
拖放适用于单个静态文本字段
我已经准备了一个示例应用程序,因此请考虑以下问题:
https://github.com/melifaro-/DraggableNSTextFieldSample
这个想法是要介绍SelectableTextField继承NSTextField。SelectableTextField提供了在文本字段选择事件上订阅感兴趣的侦听器的功能。它具有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)