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

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

ただいまの
回答率

88.83%

Timerを一定時間後に止めたいです

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 312

kazoo18

score 12

やりたいこと

ど初心者です。ご意見・助言いただければ嬉しいです。
Timerで5秒ごとに絵を切り替えるプログラミングを作成したのですが、
これを一通り表示した後、タイマーを止めたいです。
if文でどうにかできるかと試しましたが、文自体が悪いのかダメでした。
どのように対処すれば良いでしょうか。

対象コード

var timer:Timer!  

var count:Int = 0  

var dispImageNo = 0  

var imageView = UIImageView()  


override func loadView() {  
let view07A = UIView()  
view07A.frame = CGRect(x:0, y:0, width:375, height:669)  
view07A.backgroundColor = .white  
self.view = view07A  


}  

@objc func timerAction(sender:Timer){  

count = count + 1  

dispImageNo = count % 10  

print("カウントダウン")  

pictureView()  


}  
override func viewDidLoad() {  
super.viewDidLoad()  

createTimer()  

}  

func createTimer () {  

timer = Timer.scheduledTimer(timeInterval:5.0,  
target:self,  
selector: #selector(ViewController_7A.timerAction(sender:)),  
userInfo:nil,  
repeats:true)  


if count >= 10{  
timer.invalidate()  
}  
DispatchQueue.main.asyncAfter(deadline: .now() + 55.0) {  

let view07A = UIView()  
view07A.frame = CGRect(x:0, y:0, width:375, height:669)  
view07A.backgroundColor = .white  
self.view = view07A  

let button07A = UIButton()  
button07A.frame = CGRect(x:90, y:300, width:200, height:50)  
button07A.setTitle("次へ", for: .normal)  
button07A.setTitleColor(UIColor.white, for: .highlighted)  
button07A.layer.cornerRadius = 20.0  
button07A.backgroundColor = .blue  
self.view.addSubview(button07A)  

}          
}  
func pictureView() {  

let pictureArray = ["画像",  
"画像",  
"画像",  
"画像",  
"画像",  
"画像",  
"画像",  
"画像",  
"画像",  
"画像"  
]  


let name = pictureArray[dispImageNo]  

let image = UIImage(named:name)  

self.imageView.image = image  


imageView.frame = CGRect(x:0, y:0, width:200, height:300)  

let screenWidth:CGFloat = view.frame.size.width  
let screenHeight:CGFloat = view.frame.size.height  


self.imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2)  

view.addSubview(self.imageView)  

}  

@objc func tapp(_ sender:UIButton) {  

let nextvc = ViewController_7A()  

self.present(nextvc, animated: true, completion: nil)  
}  


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

以下のコードを入力することで解決をしました。

対象コード

if self.timer.isValid == true {  

self.timer.invalidate()  

}  

これDispatchQueue.main.asyncAfter(deadline: .now() + 55.0) の中に 入れたことで解決しました。

解決済 全コード

var timer:Timer!    

var count:Int = 0    

var dispImageNo = 0    

var imageView = UIImageView()    


override func loadView() {    
let view07A = UIView()    
view07A.frame = CGRect(x:0, y:0, width:375, height:669)    
view07A.backgroundColor = .white    
self.view = view07A    


}    

@objc func timerAction(sender:Timer){    

count = count + 1    

dispImageNo = count % 10    

print("カウントダウン")    

pictureView()    


}    
override func viewDidLoad() {    
super.viewDidLoad()    

createTimer()    

}    

func createTimer () {    

timer = Timer.scheduledTimer(timeInterval:5.0,    
target:self,    
selector: #selector(ViewController_7A.timerAction(sender:)),    
userInfo:nil,    
repeats:true)    


if count >= 10{    
timer.invalidate()    
}    
DispatchQueue.main.asyncAfter(deadline: .now() + 55.0) {    

let view07A = UIView()    
view07A.frame = CGRect(x:0, y:0, width:375, height:669)    
view07A.backgroundColor = .white    
self.view = view07A    

let button07A = UIButton()    
button07A.frame = CGRect(x:90, y:300, width:200, height:50)    
button07A.setTitle("次へ", for: .normal)    
button07A.setTitleColor(UIColor.white, for: .highlighted)    
button07A.layer.cornerRadius = 20.0    
button07A.backgroundColor = .blue    
self.view.addSubview(button07A)    

if self.timer.isValid == true {  

self.timer.invalidate()  

}  
}            
}    
func pictureView() {    

let pictureArray = ["画像",    
"画像",    
"画像",    
"画像",    
"画像",    
"画像",    
"画像",    
"画像",    
"画像",    
"画像"    
]    


let name = pictureArray[dispImageNo]    

let image = UIImage(named:name)    

self.imageView.image = image    


imageView.frame = CGRect(x:0, y:0, width:200, height:300)    

let screenWidth:CGFloat = view.frame.size.width    
let screenHeight:CGFloat = view.frame.size.height    


self.imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2)    

view.addSubview(self.imageView)    

}    

@objc func tapp(_ sender:UIButton) {    

let nextvc = ViewController_7A()    

self.present(nextvc, animated: true, completion: nil)    
}    


}  

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る