2016-09-15 7 views
3

私はSwiftOS Xプログラミングの新機能です。スピーチシンセサイザーの話すテキストの進行状況を示すために進捗モニターを使用しようとしています。NSSpeechStatusNumberOfCharactersLeftを使用してNSSpeechSynthesizerの進行状況インジケータを更新します。

let speechSynthesizer = NSSpeechSynthesizer() 
speechSynthesizer.delegate = self; 
speechSynthesizer.startSpeakingString(contents) 

私は定期的に、その後

progressIndicator.maxValue = Double(NSSpeechStatusNumberOfCharactersLeft.characters.count) 

とを設定し、Appleのマニュアルに従って0

私は、このキーにアクセスしようとするすべての方法を打つ必要がありますNSSpeechStatusNumberOfCharactersLeftとprogressIndicatorを、更新したいと思い、それは同じ不正確な数を返します、私は明らかにそれを正しく使用していません。私が見つけた唯一の例では、Objective-C

NSNumber *n = [[self.speechSynth objectForProperty:NSSpeechStatusProperty error:NULL] objectForKey:NSSpeechStatusNumberOfCharactersLeft]; 

ではなかったと私はSwiftにそれを翻訳してみましたが、それでも、何のサイコロ。

let count = try speechSynthesizer.objectForProperty(NSSpeechStatusProperty).objectForKey(NSSpeechStatusNumberOfCharactersLeft) 

私はまた、実行時例外をスロー

speechSynthesizer.valueForKey(NSSpeechStatusNumberOfCharactersLeft)) 
speechSynthesizer.valueWithName(NSSpeechStatusNumberOfCharactersLeft, inPropertyWithKey: NSSpeechStatusProperty)) 

を試してみました。何かご意見は?前もって感謝します!

+0

これで、状況はちょっと怪しいです。このキーNSSpeechStatusNumberOfCharactersLeftは正しい値を一度返しますが、コンピュータを再起動した後に限ります。私は –

答えて

1

あなたの第二の試みは、修正するためにかなり近い:エラーメッセージなし

let count = try speechSynthesizer.objectForProperty(NSSpeechStatusProperty).objectForKey(NSSpeechStatusNumberOfCharactersLeft) 

(と私は便利スウィフト2コンパイラを持っていないので)私は、これが失敗した理由を推測しているということですobjectForPropertyの戻り値は辞書ではないので、その値を検索することはできません。

ここでこれをテストするための私の迅速な&汚いスウィフト3遊び場です:あなたはシンセサイザーとアプリでこれを実行している場合

import PlaygroundSupport 
import Cocoa 

let synth = NSSpeechSynthesizer() 
synth.startSpeaking("I'm not standing still, I am lying in wait") 

// quick way to test for progress without setting up an app and delegate 
PlaygroundPage.current.needsIndefiniteExecution = true 
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in 
    let statusDict = try! synth.object(forProperty: NSSpeechStatusProperty) as! [String: Any] 
    print(statusDict[NSSpeechStatusNumberOfCharactersLeft]) 
} 

(もちろん、すべてのタイマーのものや遊び場のビジネスを必要としないが、

objectForPropertyの戻り値をキャストして、Swiftが辞書であることを知ってから、その辞書の文字数を調べることです。

このコードは正しく実行されますが、プログレスバーの設定には完全には機能しません。シンセサイザーの終了時にNSSpeechStatusNumberOfCharactersLeftはゼロ以外の値になる可能性があります。その場合、別のステータスキーNSSpeechStatusOutputBusyfalseになります。したがって、進行状況バーが100%にならないようにして、NSSpeechStatusOutputBusyキーまたはデリートdidFinishSpeakingコールバックのいずれかを使用して残りのバーを取ることができます。進行状況のUIを削除するか、何でも実行できます。

+0

Swift 2.2はその呼び出しがあまり好きではありませんでした(私はそれに気づいて私に尋ねないでください:P)だから私はそれを修正した:statusDict = try! speechSynthesizer.objectForProperty(NSSpeechStatusProperty)として![String:Any] print(statusDict [NSSpeechStatusNumberOfCharactersLeft])、実行時に例外がスローされます。 –

+0

Swift 2.xでは '[String:Any]'ではなく '[String:AnyObject]'が必要です。 – rickster

+0

それは、幸運を試してみました。その後、xcodeを更新し、Swift 2.3でそれを試してみました.3。それから私は3つのプレイグラウンドであなたのコードを試しました、それは実行されません、それはちょうど "Running Playground"を永遠に試してそこに座っています。多分私のdev envに問題があります:( –

関連する問題