質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3788閲覧

Swiftでプログレスバーが、うまく動作しない

apple2

総合スコア37

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/03/15 01:09

マックのデスクトップアプリ用にプログレスバーを表示したいのですが
期待通りに増えて行きません

Swift3

1@IBOutlet var progressBar: NSProgressIndicator! 2 3 @IBAction func test(_ sender: Any) { 4 self.progressBar.isHidden = false 5 self.progressBar.doubleValue = 0 6 for i in 0..<10000 { 7 print(String(i)) 8 self.progressBar.doubleValue = Double(Float(i) / 9999) 9 } 10 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このコードだと、ループ中は画面が更新されないので増えていく様子は見えないと思います。
質問用に抽出したコードなのであれば、実際のコードを書いて下さい。


sample

Swift 2

swift

1func test() { 2 3 self.progressBar.minValue = 0 4 self.progressBar.maxValue = Double(arr.count)//最大値はファイル数 5 self.progressBar.doubleValue = 0 6 self.progressBar.indeterminate = false 7 8 //別スレッドで実行 9 dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { 10 for path in self.arr { 11 12 //処理 13 print(path) 14 NSThread.sleepForTimeInterval(1.0)//コピーの代わりに1秒ウェイト 15 16 //更新 (UIなのでメインスレッドで実行) 17 dispatch_async(dispatch_get_main_queue(), { 18 self.progressBar.incrementBy(1)//1増やす 19 }) 20 } 21 print("finished") 22 } 23}

Swift3

ビルド&動作未確認です。

swift

1func test() { 2 3 self.progressBar.minValue = 0 4 self.progressBar.maxValue = Double(arr.count)//最大値はファイル数 5 self.progressBar.doubleValue = 0 6 self.progressBar.indeterminate = false 7 8 //別スレッドで実行 9 DispatchQueue.global(qos: .default).async { 10 for path in self.arr { 11 12 //処理 13 print(path) 14 Thread.sleep(forTime​Interval:1.0)//コピーの代わりに1秒ウェイト 15 16 //更新 (UIなのでメインスレッドで実行) 17 DispatchQueue.main.async { 18 self.progressBar.increment(by:1)//1増やす 19 }) 20 } 21 print("finished") 22 } 23}

投稿2017/03/15 01:56

編集2017/03/16 01:17
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apple2

2017/03/15 05:52 編集

ありがとうございます ファイルをリネームして複製を作ろうとしています 実際のコードは、一部ですが var iii = 0 for path in arr { let newName = renameHeader + "_" + path do { let srcPath = NSString(string: capPath + "/" + path).expandingTildeInPath let dstPath = NSString(string: capPath + "/" + newName).expandingTildeInPath try fm.moveItem(atPath: srcPath, toPath: dstPath) try fm.copyItem(atPath: dstPath, toPath: localPath + "/" + newName) } catch let error as NSError { print(error) } self.progressBar.doubleValue = Double(Float(iii) / Float(arr.count - 1)) iii += 1 } self.textBox.stringValue = String(iii) + "ファイル移動しました"
fuzzball

2017/03/15 06:10

print(String(i))だろうがファイルのコピーだろうが同じことです。 ループの中では画面は更新されないと思います。 例えば、Labelを配置して、そこにiiiの値を表示させてみて下さい。 進行とともにLabelの値が変化するでしょうか?
apple2

2017/03/16 00:31

Labelも変化しません
fuzzball

2017/03/16 01:18

サンプルを追加しましたので、あとはがんばって下さい。
apple2

2017/03/16 01:38

ご丁寧にありがとうございます、うまくいきました 大変勉強になりました、感謝します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問