2017-05-01 5 views
11

를 업데이트하기 전에 다른 응용 프로그램에 초점을 저를 필요로한다. 내가하려고하는 것은 입력시 슬라이더의 값을 업데이트하는 것입니다. 그래서, 내가 한 일은 다음과 같습니다.nsslider.integerValue 내가 <code>wave_mode_slider</code>라는 내 맥 OS의 앱에 <code>NSSlider</code>이 값

self.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue 

이렇게하면 슬라이더의 값 (흰색 점)이 의도 한대로 입력 값으로 설정됩니다. 그러나 실제 결과가 표시되기 전에 응용 프로그램 외부를 클릭해야합니다. 그러면 슬라이더의 흰색 점이 새로운 값으로 이동합니다. 다음과 같이 : enter image description here

즉시 슬라이더 업데이트를 만들 수있는 방법이 있습니까?

내 슬라이더는 다음과 같이 생성됩니다

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!) 

내가 true로 슬라이더의 isContinuous 속성을 설정하려고했으나 그 결과를 변경 doen't.


편집 :

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의 코멘트를 보았다대로 빨리, 아주 쉬웠다 결국 값

+0

셀을 바꾸지 않으면 작동합니까? – Willeke

+0

@Willeke 아니, 같은 출력을 얻을 –

+0

나는 당신의 코드를 시도하고 작동합니다. 문제는 아마도 코드의 다른 부분 일 것입니다. 어디에서 값을 설정합니까? – Willeke

답변

4

을 얻을 이리저리 m이며, 나는 단지 주 스레드를 사용하여 다음 값을 설정하십시오.

DispatchQueue.main.async { 
    mySelf.wave_mode_slider?.floatValue = ("\(params[2])" as NSString).floatValue 
}