nsslider.integerValue 要求我在更新值之前专注于另一个应用程序
Posted
技术标签:
【中文标题】nsslider.integerValue 要求我在更新值之前专注于另一个应用程序【英文标题】:nsslider.integerValue requires me to focus on another app before updating the value 【发布时间】:2017-05-01 13:06:08 【问题描述】:我的 macos 应用中有一个 NSSlider
,名为 wave_mode_slider
。我要做的是在输入时更新所述滑块的值。所以,我做的是这样的:
self.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue
这会将滑块(白点)的值设置为预期的输入值。但是,在看到任何实际结果之前,我必须在应用程序外部单击,这会导致滑块的白点跳到它的新值。如图:
有没有办法让滑块立即更新?
我的滑块是这样创建的:
self.wave_mode_slider = NSSlider(frame:CGRect(x: 10, y: 100, width: 20, height: 300))
self.wave_mode_slider?.cell = OWOWSliderVertical()
self.wave_mode_slider?.maxValue = 127
self.wave_mode_slider?.target = self
self.view?.addSubview(self.wave_mode_slider!)
我尝试将滑块的 isContinuous
属性设置为 true,但这不会改变结果。
编辑:
var midiClient : MIDIClientRef = 0
var inPort : MIDIPortRef = 0
let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
MIDIClientCreate("WobClient" as CFString, nil, nil, &midiClient)
MIDIInputPortCreate(midiClient, "WobClient_InPort" as CFString,
(pktList: UnsafePointer<MIDIPacketList>, readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) -> Void in
let packetList : MIDIPacketList = pktList.pointee
var packet : MIDIPacket = packetList.packet
let mySelf = Unmanaged<Wob>.fromOpaque(srcConnRefCon!).takeUnretainedValue()
for _ in 1...packetList.numPackets
let bytes = Mirror(reflecting: packet.data).children
var params : [UInt64] = []
var i = packet.length
for (_, attr) in bytes.enumerated()
let string = String(format: "%02X ", attr.value as! UInt8)
params.append(UInt64(strtoul(string, nil, 16)))
i -= 1
if (i <= 0)
break
// print(("\(params[2])" as NSString).integerValue)
mySelf.setWaveSliderValue(value: ("\(params[2])" as NSString).integerValue)
packet = MIDIPacketNext(&packet).pointee
, nil, &inPort)
MIDIPortConnectSource(inPort, self.source, observer)
这是我获得价值的地方
【问题讨论】:
不更换单元格是否有效? @Willeke 不,我得到相同的输出 我试过你的代码,它可以工作。问题可能出在代码中的其他地方。从哪里设置值? @Willeke 在 C 风格的函数指针中,我从 MIDI 输入信号中设置值 @Willeke 当我尝试非常基本地做print(1)
时,每次我尝试设置值时,它都会向我的控制台发送垃圾邮件。所以很明显,我设置值的函数被调用了
【参考方案1】:
最后还是很简单的,一看到Willeke关于线程的评论,我就用主线程来设置值:
DispatchQueue.main.async
mySelf.wave_mode_slider?.floatValue = ("\(params[2])" as NSString).floatValue
【讨论】:
以上是关于nsslider.integerValue 要求我在更新值之前专注于另一个应用程序的主要内容,如果未能解决你的问题,请参考以下文章