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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

2回答

887閲覧

swift: ボタン連打した場合、テキストを表示する時間を最後に押した瞬間から表示させたい。

ryo_py

総合スコア25

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/04/16 14:56

前提・実現したいこと

現在、ボタンを押すとテキストを表示して、3秒後にテキストを消す処理をしています。

swift

1label.text = "Hello" 2DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 3 self.attentionLabel.text = "" 4}

しかし、これだとボタンを連打した場合、テキストが消えるタイミングが最初にボタンを押した瞬間の3秒後になってしまいます。

これを、ボタンを連打している間はテキストを表示し続けて、最後にボタンを押した瞬間から3秒後にしたいです。

分かる方いましたら、教えていただけると幸いです。

試したこと

○秒後に処理をするのではなく、○秒間処理をするという風にすれば解決できるかと考えましたが、その処理が見つかりませんでした。

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

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

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

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

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

guest

回答2

0

swift

1class ViewController: UIViewController { 2 @IBOutlet weak var attentionLabel: UILabel! 3 @IBOutlet weak var eraseButton: UIButton! 4 var erasingTimer: Timer? 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 10 @IBAction func onEraseButtonTapped(_ sender: UIButton) { 11 // Create Timer if it is not been created yet 12 if(self.erasingTimer == nil) { 13 self.erasingTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false, block: { (_) in 14 self.attentionLabel.text = "" 15 print("-> Erased: (Date())") 16 }) 17 } 18 19 // update fireDate to after 3 seconds from now 20 self.erasingTimer?.fireDate = Date(timeIntervalSinceNow: 3.0) 21 print("Tapped: (Date())") 22 } 23}

Swiftには明るくないので、お作法的にもっとよい書き方があるかもしれませんが……

投稿2020/04/16 15:54

thyda.eiqau

総合スコア2982

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

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

0

ベストアンサー

非同期処理をするんではなくて、3秒のタイマで実行させましょう。
ボタンを押すごとに、タイマをリセットさせればよろしい

投稿2020/04/16 15:13

y_waiwai

総合スコア87784

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

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

ryo_py

2020/04/16 16:37

想定の処理ができました!! タイマーも結局"○秒後に処理"なので使えないと思っていたのですが、リセットさせてから再スタートさせればよかったのですね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問