【Swift】ボタンを押しても処理を重複させないようにしたいが、処理が終わると再度処理が始まってしまう
Q&A
Closed
解決したいこと
ボタンを押したとき、メソッドの処理が終わるまで再度ボタンを押しても処理を重複させないようにしたいんですが、処理が終わると再度処理が始まってしまいます。
ここでは button.isHidden = true
でボタンを消す方法を試していますが、頭に書いてるにも関わらず、メソッドに書かれた処理が終わってから有効になってしまいます。
該当するソースコード
どんな実装なのか、詳細は下記の記事です。
https://qiita.com/antk/items/d0dc6a6c9ff68747dd6c
import UIKit
import AudioToolbox
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func actionButton(_ sender: UIButton) {
button.isHidden = true
repeater()
}
func repeater() {
let now = Date()
let time = Calendar.current.dateComponents([.hour, .minute], from: now)
// hour を12時間で丸める
let hour = time.hour! % 12
let quarter = time.minute! / 15
let minute = time.minute! % 15
// 低音ゴング
let lowGong:SystemSoundID = 1054
// 高音ゴング
let highGong:SystemSoundID = 1013
// 第一ゴング
for _ in 0 ..< hour {
print("dong")
AudioServicesPlaySystemSound(lowGong)
// 0.5秒待つ
Thread.sleep(forTimeInterval: 0.5)
}
// 第二ゴングが鳴る場合遅延処理
if quarter > 0 {
Thread.sleep(forTimeInterval: 0.7)
}
// 第二ゴング
for _ in 0 ..< quarter {
print("ding-dong")
AudioServicesPlaySystemSound(highGong)
// 0.4秒待つ
Thread.sleep(forTimeInterval: 0.4)
AudioServicesPlaySystemSound(lowGong)
// 0.5秒待つ
Thread.sleep(forTimeInterval: 0.5)
}
// 第三ゴングが鳴る場合遅延処理
if minute > 0 {
Thread.sleep(forTimeInterval: 0.7)
}
// 第三ゴング
for _ in 0 ..< minute {
print("ding")
AudioServicesPlaySystemSound(highGong)
// 0.5秒待つ
Thread.sleep(forTimeInterval: 0.5)
}
}
}
自分で試したこと
メンバ変数に var isPlaing: Bool = false
を設置する方法や isEnabled
を使う方法も試してみましたがうまく行きませんでした。
これらのパターンの場合、頭でこのメソッド自体を無効にしておいて、要所々々で print
を使って無効になっているかを試しました。この場合、Bool値で無効になっているのを確認はしたんですが、やはりボタンを複数回押すと処理が複数回スタックに積まれてしまいます。