我在一个MacOS应用上有一个Swift-4的MacOS应用程序。
它的目的是用户输入一个数字。是否有一种方法可以根据鼠标滚轮的向上滚动或向下滚动来更改数字?
发布于 2017-12-20 15:59:55
您只需重写scrollWheel(with event: NSEvent)方法,并检查event.deltaY是正还是负,并增加或减少textField值:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var textField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.stringValue = "0"
}
override func scrollWheel(with event: NSEvent) {
super.scrollWheel(with: event)
if var value = Int(textField.stringValue) {
if event.deltaY > 0 { value += 1 }
if event.deltaY < 0 { value -= 1 }
textField.stringValue = String(value)
print(value)
}
}
}如果您只想更改具有焦点的字段,可以使用视图窗口fieldEditor:
if let text = view.window?.fieldEditor(false, for: nil) {
if var value = Int(text.string) {
if event.deltaY > 0 { value += 1 }
if event.deltaY < 0 { value -= 1 }
text.string = String(value)
print(value)
}
}如果希望将滚动限制在特定字段,则需要将视图控制器设置为它的委托,并将其委托与textfield对象进行比较:
import Cocoa
class ViewController: NSViewController, NSTextFieldDelegate {
@IBOutlet weak var textField1: NSTextField!
@IBOutlet weak var textField2: NSTextField!
override func viewDidAppear() {
super.viewDidAppear()
textField1.delegate = self
}
override func viewDidLoad() {
super.viewDidLoad()
textField1.stringValue = "0"
textField2.stringValue = "0"
}
override func scrollWheel(with event: NSEvent) {
super.scrollWheel(with: event)
NSSound(named: "Tink")?.stop
if view.window?.firstResponder?.textView?.delegate === textField1,
let text = view.window?.fieldEditor(false, for: nil),
var value = Int(text.string) {
if event.deltaY < 0 { value += 1 }
if event.deltaY > 0 { value -= 1 }
NSSound(named: "Tink")?.play()
text.string = String(value)
print(value)
}
}
}extension NSResponder {
var textView: NSTextView? { return self as? NSTextView }
}https://stackoverflow.com/questions/47909725
复制相似问题