前提・実現したいこと
ボタンを押してからジャンケンの結果が表示されるまでの2秒間、ボタンを押せないようにしたい
該当のソースコード
Swift
1import UIKit 2 3final class ViewController: UIViewController { 4 5 @IBOutlet weak var cpHandImageView: UIImageView! 6 @IBOutlet weak var janken: UILabel! 7 @IBOutlet var selectbutton: UIButton! 8 9 var timer: Timer? 10 var nowIndex:Int = 0 11 12 enum hand: Int { 13 case rock = 0 14 case scissors = 1 15 case paper = 2 16 } 17 18 var cpHandImage:[UIImage] = [ 19 #imageLiteral(resourceName: "rockpic"),#imageLiteral(resourceName: "scissorspic"),#imageLiteral(resourceName: "paperpic") 20 ] 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 // Do any additional setup after loading the view. 25 26 } 27 28 @IBAction func jankenAction(_ sender: UIButton) { 29 // ✊, ✌️, ✋のボタンに割当 30 selectbutton.isEnabled = false 31 let Button = Int(sender.tag) 32 guard 33 let youHand = hand(rawValue: Button), 34 let cpHand = hand(rawValue: Int.random(in: 0...2)) else { 35 return 36 } 37 38 if timer == nil { 39 timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(changeImage), userInfo: nil, repeats: true) 40 } 41 DispatchQueue.main.asyncAfter(deadline: .now() + 1.99) { 42 self.timer?.invalidate() 43 self.janken(youHand: youHand, cpHand: cpHand) 44 self.result(youHand: youHand, cpHand: cpHand) 45 self.timer = nil 46 self.selectbutton.isEnabled = true 47 } 48 49 } 50 51 @objc func changeImage() { 52 nowIndex += 1 53 if (nowIndex == cpHandImage.count) { 54 nowIndex = 0 55 } 56 cpHandImageView.image = cpHandImage[nowIndex] 57 } 58 59 func janken(youHand: hand, cpHand: hand) { 60 if youHand.rawValue == cpHand.rawValue { 61 janken.text = "you draw" 62 }else if (youHand.rawValue + 1)%3 == cpHand.rawValue { 63 janken.text = "you win!" 64 }else { 65 janken.text = "you lose" 66 } 67 } 68 69 func result(youHand: hand, cpHand: hand) { 70 if cpHand.rawValue == 0 { 71 self.cpHandImageView.image = #imageLiteral(resourceName: "rockpic") 72 } else if cpHand.rawValue == 1 { 73 self.cpHandImageView.image = #imageLiteral(resourceName: "scissorspic") 74 } else if cpHand.rawValue == 2 { 75 self.cpHandImageView.image = #imageLiteral(resourceName: "paperpic") 76 } 77 } 78} 79
試したこと
selectbutton.isEnabled = true
selectbutton.isEnabled = false
を使用しました。私の認識として上記のプログラムは、ある関数や動作と同じタイミングで挿入してボタンを無効化し、その後の関数や動作と同じタイミングで挿入し有効化するという使い方だと思っています。
今回の場合jankenAction関数で✊✌️✋のいずれかのボタンを押した時に✊✌️✋のボタンを無効化し、DispatchQueueで2秒後に遅延処理を行うと宣言した場所に有効化するというメソッドを実装するため、上記のソースコードのように、jankenAction関数の冒頭に selectbutton.isEnabled = falseを挿入し、DispatchQueueのところにtrueを挿入しました。
発生している問題・エラーメッセージ
selector sent to instance 0x60000304f1e0"
そもそも、私の認識が正しいかも定かではありませんが、このようなエラーが出てしまいました。
補足情報(FW/ツールのバージョンなど)
解決策と、今回のエラーコードの意味について教えていただけると幸いです。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー