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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

1回答

2480閲覧

【Swift】dismissViewControllerAnimatedを使用すると、invalidate()したタイマーが動いてしまう

hanzoo

総合スコア28

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クリップ

投稿2015/12/17 12:05

編集2015/12/17 13:47

一回以上RetryButtonを押し、ゲーム画面(GameViewControllerScene)を再表示すると、
all Dismiss Buttonを押してスタート画面(ViewControllerScene)を表示した際に、
invalidate()したタイマーが作動してしまいます。

タイマーが動いてしまわないようにする為にはどのようにしたら良いでしょうか。

環境
Xcode 7.1.1

使用ライブラリ
Spring(【よーい】【どん】のアニメーション機能に)

View構成図

Swift

1// ViewController.swift 2 3import UIKit 4 5class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 } 11 12 override func didReceiveMemoryWarning() { 13 super.didReceiveMemoryWarning() 14 } 15 16}

Swift

1// GameViewController.swift 2 3import UIKit 4 5class GameViewController: UIViewController { 6 7 @IBOutlet weak var readeyGoLabel: DesignableLabel! 8 @IBOutlet weak var timerLabel: UILabel! 9 10 var cnt: Float = 20.0 11 var timer: NSTimer! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 timerLabel.text = "TIME: \(self.cnt)" 17 readeyGoLabel.text = "" 18 19 } 20 21 override func viewDidAppear(animated: Bool) { 22 readyGoAnimation() 23 } 24 25 func readyGoAnimation() { 26 27 readeyGoLabel.text = "よーい" 28 readeyGoLabel.animation = "fadeIn" 29 readeyGoLabel.curve = "spring" 30 readeyGoLabel.duration = 1.4 31 readeyGoLabel.animateNext { () -> () in 32 33 self.readeyGoLabel.text = "どん" 34 self.readeyGoLabel.animation = "fadeOut" 35 self.readeyGoLabel.curve = "spring" 36 self.readeyGoLabel.duration = 0.7 37 self.readeyGoLabel.delay = 0.1 38 self.readeyGoLabel.animate() 39 40 self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "countDown:", userInfo: nil, repeats: true) 41 } 42 } 43 44 func countDown(timer : NSTimer) { 45 46 if cnt < 0 { 47 timer.invalidate() 48 self.timerLabel.text = "TIME: 0.0" 49 50 } else { 51 52 let str = "TIME: ".stringByAppendingFormat("%.1f",cnt) 53 print(str) 54 timerLabel.text = str 55 cnt -= 0.1 56 } 57 58 } 59 60 override func didReceiveMemoryWarning() { 61 super.didReceiveMemoryWarning() 62 } 63 64 @IBAction func retryButtonTapped(sender: AnyObject) { 65 timer.invalidate() 66 } 67 68 @IBAction func allDismissButtonTapped(sender: AnyObject) { 69 timer.invalidate() 70 UIApplication.sharedApplication().keyWindow!.rootViewController?.dismissViewControllerAnimated(true, completion: nil) 71 } 72 73} 74

補足
アプリには、主に下記のような機能を実装しています。

  • スタート画面(ViewControllerScene)からゲーム画面(GameViewControllerScene)に遷移する。
  • ゲーム画面に遷移するとfadeInで【よーい】、fadeOutで【どん】と表示される。
  • NSTimer.scheduledTimerWithTimeIntervalを利用して、20秒のカウントダウンが始まる。
  • all Dismiss Buttonを押すとスタート画面、RetryButtonを押すと再びゲーム画面が表示される。

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

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

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

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

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

guest

回答1

0

ベストアンサー

タイマーを生成するところを以下の様に変更してみてください。

swift

1if self.timer == nil { 2 self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "countDown:", userInfo: nil, repeats: true) 3} else { 4 self.timer.fire() 5}

投稿2015/12/17 22:34

_Kentarou

総合スコア8490

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

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

hanzoo

2015/12/18 00:31

こちらの方法で解決出来ました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問