質問するログイン新規登録

質問編集履歴

1

コードを追加しました。

2019/05/16 14:11

投稿

AppDvl
AppDvl

スコア58

title CHANGED
File without changes
body CHANGED
@@ -22,4 +22,254 @@
22
22
 
23
23
  初めて作ったアプリでいよいよ世の中に出せると思ったら今回のエラーで躓いています。
24
24
  昨日と今日、頑張りましたが自力では無理なようです。
25
- どなたかご教授お願いします。
25
+ どなたかご教授お願いします。
26
+ ```
27
+ //
28
+ // ViewController.swift
29
+ // testTimer
30
+ //
31
+ // Created by MBP13 on 2019/05/01.
32
+ // Copyright © 2019 Tomoyuki Ashikari. All rights reserved.
33
+ //
34
+
35
+
36
+ import UIKit
37
+ import AudioToolbox //バイブ用
38
+ import GoogleMobileAds
39
+
40
+
41
+ class ViewController: UIViewController, GADBannerViewDelegate {
42
+
43
+ var userTimer = 0
44
+ var userSecTimer = 0
45
+ var count = 0.0
46
+ var reUserTime = 0
47
+ var reUserSecTime = 0
48
+ var reCount = 0.0
49
+ var elapsedTime = 0.0
50
+ var c = 0
51
+ var timer = Timer()
52
+ //var startDate = Date() //2019-05-01 12:55:48 +0000で取得
53
+ var stopDate = Date()
54
+ var startDate = Date()
55
+
56
+ var bannerView: GADBannerView!//広告用
57
+
58
+
59
+ @IBOutlet weak var minButton: UIButton!
60
+ @IBOutlet weak var secButton: UIButton!
61
+ @IBOutlet weak var reset: UIButton!
62
+ @IBOutlet weak var startButton: UIButton!
63
+ @IBOutlet weak var stopButton: UIButton!
64
+ @IBOutlet weak var timerLabel: UILabel!
65
+
66
+ var secLabel:UILabel!
67
+ var msecLabel:UILabel!
68
+
69
+ func addBannerViewToView(_ bannerView: GADBannerView) {//広告用
70
+ bannerView.translatesAutoresizingMaskIntoConstraints = false//広告用
71
+ view.addSubview(bannerView)//広告用
72
+ view.addConstraints(//広告用
73
+ [NSLayoutConstraint(item: bannerView,//広告用
74
+ attribute: .bottom,//広告用
75
+ relatedBy: .equal,//広告用
76
+ toItem:view.safeAreaLayoutGuide,//広告用
77
+ attribute: .bottom,//広告用
78
+ multiplier: 1,//広告用
79
+ constant: 0),//広告用
80
+ NSLayoutConstraint(item: bannerView,//広告用
81
+ attribute: .centerX,//広告用
82
+ relatedBy: .equal,//広告用
83
+ toItem: view,//広告用
84
+ attribute: .centerX,//広告用
85
+ multiplier: 1,//広告用
86
+ constant: 0)//広告用
87
+ ])//広告用
88
+ }//広告用
89
+
90
+ override func viewDidLoad() {
91
+ super.viewDidLoad()
92
+ //startDates配列を再び読み込みset
93
+ if userDefaults.object(forKey: "startDates") != nil {
94
+ startDates = userDefaults.array(forKey: "startDates") as! [Date] //配列startDatesに呼び出し
95
+ }
96
+
97
+ bannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)//広告用
98
+ addBannerViewToView(bannerView)//広告用
99
+ bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"//広告用
100
+ bannerView.rootViewController = self//広告用
101
+ bannerView.load(GADRequest())//広告用
102
+ bannerView.delegate = self//広告用
103
+ }
104
+
105
+ //バイブ関数
106
+ func vibrate() {
107
+ AudioServicesPlaySystemSound( 1011 )
108
+ }
109
+
110
+ override func viewDidAppear(_ animated: Bool) {
111
+ super.viewDidAppear(animated)
112
+ if count == 0.0 {
113
+ setButtonEnabled(true, true, false, false, false)
114
+ }else if timer.isValid == false { //タイマーが止まっていたら
115
+ setButtonEnabled(false, false, true, false, true)
116
+ }else{
117
+ setButtonEnabled(false, false, false, true, true)
118
+ }
119
+ // setAdjustsImageWhenDisabled()
120
+ //画面が表示されたらタイマーを動かす
121
+ // createTimer()
122
+ }
123
+
124
+
125
+ //タイマーの処理
126
+ @objc func timerAction(sender:Timer){
127
+
128
+ var minCount = Int(count)/60
129
+ var secCount = Int(count) % 60
130
+ var msecCount = Int((count - Double(minCount * 60) - Double(secCount)) * 100.0)
131
+ timerLabel.text = String(format:"%02d:%02d:%02d",minCount,secCount,msecCount)//%02dで整数を表示
132
+ // secLabel.text = String(secCount)
133
+ // msecLabel.text = String(msecCount)
134
+ count -= 0.1
135
+
136
+ if count <= 0.0{
137
+ sender.invalidate() //止める
138
+ setButtonEnabled(true, true, false, false, false)
139
+
140
+ userTimer = 0
141
+ userSecTimer = 0
142
+ elapsedTime = 0
143
+ count = 0
144
+ minCount = 0
145
+ secCount = 0
146
+ msecCount = 0
147
+ timerLabel.text = String(format:"%02d:%02d:%02d",0,0,0)
148
+ vibrate()// バイブ起動
149
+ AudioServicesPlaySystemSoundWithCompletion(1013) {
150
+ //サウンドが鳴り終わった後の処理を記述
151
+ }
152
+ //再スタート用
153
+ let minCount = Int(self.reCount)/60
154
+ let secCount = Int(self.reCount) % 60
155
+ let msecCount = Int((self.reCount - Double(minCount * 60) - Double(secCount)) * 100.0)
156
+ self.timerLabel.text = String(format:"%02d:%02d:%02d",minCount,secCount,msecCount)//%02dで整数を表示
157
+ setButtonEnabled(true,true,true,false,true)
158
+
159
+ }
160
+ }
161
+ func setButtonEnabled(_ minButton:Bool,_ secButton:Bool,_ startButton:Bool,_ stopButton:Bool,_ reset:Bool){ //bool型の変数をisEnabledに代入
162
+ self.minButton.isEnabled = minButton
163
+ self.secButton.isEnabled = secButton
164
+ self.startButton.isEnabled = startButton
165
+ self.stopButton.isEnabled = stopButton
166
+ self.reset.isEnabled = reset
167
+ }
168
+
169
+ //非選択の色を変えない、ボタンの設定でカスタムにしないと機能しない
170
+ // func setAdjustsImageWhenDisabled(){
171
+ // self.minButton.adjustsImageWhenDisabled = false
172
+ // self.secButton.adjustsImageWhenDisabled = false
173
+ // self.startButton.adjustsImageWhenDisabled = false
174
+ // self.stopButton.adjustsImageWhenDisabled = false
175
+ // self.reset.adjustsImageWhenDisabled = false
176
+ // }
177
+
178
+
179
+ @IBAction func minButton(_ sender: Any) {
180
+ setButtonEnabled(true, true, true, false, true)
181
+ // setAdjustsImageWhenDisabled()
182
+ if reCount > 0{
183
+ userTimer = reUserTime
184
+ userSecTimer = reUserSecTime
185
+ }
186
+ userTimer += 1
187
+ reUserTime += 1
188
+ timerLabel.text = String(format:"%02d:%02d:%02d",userTimer,userSecTimer,0)
189
+ }
190
+
191
+
192
+ @IBAction func secButton(_ sender: Any) {
193
+ setButtonEnabled(true, true, true, false, true)
194
+ // setAdjustsImageWhenDisabled()
195
+ if reCount > 0{
196
+ userTimer = reUserTime
197
+ userSecTimer = reUserSecTime
198
+ }
199
+ userSecTimer += 10
200
+ reUserSecTime += 10
201
+ timerLabel.text = String(format:"%02d:%02d:%02d",userTimer,userSecTimer,0)
202
+ }
203
+
204
+ @IBAction func startButton(_ sender: Any) {
205
+ setButtonEnabled(false,false,false,true,false)
206
+ // setAdjustsImageWhenDisabled()
207
+ stopDate=Date()
208
+ // 第1引数は差分を表現する形式を指定します 時間の差を計算する
209
+ let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond], from: startDate, to: stopDate)
210
+
211
+ if Int(dateComponents.second!) <= 2 { //2秒以内は配列に送らずにセットにカウントしない
212
+
213
+ }else{
214
+ //広域配列startDatesに追加していく
215
+ startDates.append(Date())
216
+ userDefaults.set(startDates, forKey:"startDates")//永続化で保存
217
+ // print("startDatesで永続化したデータは")
218
+ // print(startDates)
219
+ }
220
+ //タイマーの作成
221
+ func createTimer(){
222
+ print(count)
223
+ print(reCount)
224
+
225
+ if reCount > 0 && count == 0{
226
+ reCount = (Double(reUserTime) * 60 + Double(reUserSecTime))
227
+ count = reCount
228
+ }else{
229
+ count = (Double(userTimer) * 60 + Double(userSecTimer) + elapsedTime)
230
+ }
231
+ reCount = (Double(reUserTime) * 60 + Double(reUserSecTime))
232
+ //0になったら元に戻すためのて変数
233
+ self.timer = Timer.scheduledTimer(timeInterval: 0.1,
234
+ target: self,
235
+ selector: #selector(self.timerAction(sender:)),
236
+ userInfo: nil,
237
+ repeats: true)
238
+ // timer.fire()
239
+ }
240
+ createTimer()
241
+ }
242
+
243
+ @IBAction func stopButton(_ sender: Any) {
244
+ setButtonEnabled(false, false, true, false, true)
245
+ stopDate = Date()
246
+
247
+ userTimer = 0
248
+ userSecTimer = 0
249
+ elapsedTime = count
250
+ self.timer.invalidate()//止める
251
+ }
252
+
253
+ @IBAction func reset(_ sender: Any) {
254
+ setButtonEnabled(true, true, false, false, false)
255
+ // setAdjustsImageWhenDisabled()
256
+ userTimer = 0
257
+ userSecTimer = 0
258
+ reUserTime = 0
259
+ reUserSecTime = 0
260
+ elapsedTime = 0
261
+ count = 0
262
+ reCount = 0
263
+ timerLabel.text = String(format:"%02d:%02d:%02d",userTimer,userSecTimer,0)
264
+ self.timer.invalidate()//止める
265
+ }
266
+
267
+ @IBAction func transitionButton(_ sender: Any) {
268
+ setButtonEnabled(false, false, false, true, true)
269
+ userTimer = 0
270
+ userSecTimer = 0
271
+ elapsedTime = count
272
+ }
273
+ }
274
+
275
+ ```