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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

1743閲覧

一定時間のUIbutton無効化

Narikura

総合スコア6

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/08/12 05:08

編集2020/08/12 08:32

前提・実現したいこと

ボタンを押してからジャンケンの結果が表示されるまでの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/ツールのバージョンなど)

解決策と、今回のエラーコードの意味について教えていただけると幸いです。よろしくお願いいたします。

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

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

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

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

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

TsukubaDepot

2020/08/12 05:14

このままだと丸投げのご質問となってしまいます。 どこにどのなコードを入れてみたのか、またそこで期待した結果と実際の結果がどのように異なっていたのか、ご質問に追記していただいた方がより確実な回答がつくかと思います。 また、 @IBAction func jankenAction(_ sender: UIButton) は複数のボタンで共通に利用している Action だと思いますが、それは過去の質問を知っている人にしかわからないため、面倒でも毎回ご説明いただいた方がいい(コード中にコメントしておくのがいいかもしれません)と思います。
Narikura

2020/08/12 05:25

質問者としての心構えが足りず申し訳ありません。質問を修正いたしました。まだまだ初心者で、どこにどのコードを記述すればいいかもあやふやな状態で、解答者様にご迷惑をおかけすることも多いかと思いますがよろしくお願いいたします。
TsukubaDepot

2020/08/12 05:54

回答者には迷惑はかからないと思っています。 一方、何をどのようにやったのかわからない限り、結局は行き違いが発生し、おもったように意思疎通ができないまま終わってしまうパターンが多いように感じています。 > 具体的には、上記のcodeを記述した後、if構文により条件分けを行うのかと思いますが、どの場所に、どのようにコードを記述すれば良いかわからない状況です。 とありますが、これだけコードがかけるのであれば、さほど難しいことではないと思うので、どこにどのように迷っているのか逆に判断しかねている状況です。 これらのコードは誰かに教えてもらったものなのでしょうか(非難するつもりはありません。そうであれば、それなりの回答方法がありますので、教えていただければと思います)。
TsukubaDepot

2020/08/12 05:56

そもそも、if文を使う必要もないと思っています。 1. ボタンを押されたときの処理はどこで行われるのか 2. 約2秒経過したあとの処理はどこで行われるおか それぞれ理解していれば、さほど難しい話では内容に思えます。 むしろ、ボタンを押した瞬間(これはIBActionで)、2秒経過した後の処理をご自身で(DispatchQueueを使って)書かれているわけですから、2秒後にボタンを有効に戻す処理を書くことは全く難しくないと思いますが、いかがでしょうか。
Narikura

2020/08/12 08:36

ご指摘ありがとうございます。TsukubaDepot様の助言を踏まえまして、質問を修正いたしました。 遅延処理に限らず、Web上に上がっている情報の写経という感じで本質的にはまだ理解が乏しいため、本来は難しくない処理なのかもしれませんが、Web上の情報では理解ができませんでしたので今回質問させていただきました。申し訳ございません。
guest

回答2

0

画面を触らせたくないということであれば以下の方法でも良いと思います、時間が来たら trueに設定すればボタンも効くようになります。

swift

1view.isUserInteractionEnabled = false

投稿2020/08/13 04:30

_Kentarou

総合スコア8490

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

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

0

自己解決

今回定義したselectbuttonがarrayのためfor in文を使って1つ1つ要素を摘出してenebledを変更しなければならなかった。

投稿2020/08/13 01:22

Narikura

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問