このサイトを参考に初めてSwiftでアラームアプリを作成しようとしているのですが、思ったような表示結果になりません。
問題
アラームアプリを作成し実行したのですが、実行しても何も表示されません。
viewController.swiftを編集しなければならないのでしょうか?
参考にしているサイトには以下の4つのソースコードしかありませんので、ほかをどのようにすれば表示されるのか教えて頂けると幸いです。
Alarm.swift
Swift
1import UIKit 2import AVFoundation 3 4class Alarm{ 5 var selectedWakeUpTime:Date? 6 var audioPlayer: AVAudioPlayer! 7 var sleepTimer: Timer? 8 var seconds = 0 9 10 func runTimer(){ 11 seconds = calculateInterval(userAwakeTime: selectedWakeUpTime!) 12 guard sleepTimer == nil else{return} 13 if sleepTimer == nil{ 14 sleepTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) 15 } 16 } 17 18 @objc private func updateTimer(){ 19 if seconds != 0{ 20 seconds -= 1 21 22 print(seconds) 23 }else{ 24 sleepTimer?.invalidate() 25 sleepTimer = nil 26 let soundFilePath = Bundle.main.path(forResource: "", ofType: "")! 27 let sound:URL = URL(fileURLWithPath: soundFilePath) 28 do{ 29 audioPlayer = try AVAudioPlayer(contentsOf: sound, fileTypeHint: nil) 30 try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: []) 31 try AVAudioSession.sharedInstance().setActive(true) 32 }catch{ 33 print("Could not load file") 34 } 35 audioPlayer.play() 36 print(audioPlayer.isPlaying) 37 } 38 } 39 40 private func calculateInterval(userAwakeTime:Date)->Int{ 41 var interval = Int(userAwakeTime.timeIntervalSinceNow) 42 if interval < 0{ 43 interval = 86400 - (0 - interval) 44 } 45 46 let calendar = Calendar.current 47 let seconds = calendar.component(.second, from: userAwakeTime) 48 return interval - seconds 49 } 50 51 @IBOutlet var sleepTimePicker: UIDatePicker! 52 53 @IBAction func alarmBtnWasPressed(_ sender: UIButton){ 54 55 } 56 57 func stopTimer(){ 58 if sleepTimer != nil{ 59 sleepTimer?.invalidate() 60 sleepTimer = nil 61 }else{ 62 audioPlayer.stop() 63 } 64 } 65 66}
SleepingViewController.swift
Swift
1import Foundation 2import UIKit 3 4class SleepingViewController: UIViewController{ 5 var currentTime = CurrentTime() 6 7 @IBOutlet var timeLabel: UILabel! 8 9 override func viewDidLoad(){ 10 currentTime.delegate = self 11 } 12 13 @IBAction func closeBtnWasPressed(_ sender: UIButton){ 14 dismiss(animated: true, completion: nil) 15 } 16 17 func updateTime(_ time:String){ 18 timeLabel.text = time 19 } 20}
SetViewController.swift
Swift
1import UIKit 2import AVFoundation 3 4class SetViewController: UIViewController{ 5 6 let alarm = Alarm() 7 8 @IBOutlet var sleepTimePicker: UIDatePicker! 9 10 override func viewDidLoad(){ 11 super.viewDidLoad() 12 sleepTimePicker.datePickerMode = UIDatePicker.Mode.time 13 sleepTimePicker.setDate(Date(), animated: false) 14 } 15 16 override func viewDidAppear(_ animated: Bool){ 17 if alarm.sleepTimer != nil{ 18 alarm.stopTimer() 19 } 20 } 21 22 @IBAction func alatmBtnWasPressed(_ sender: UIButton){ 23 alarm.selectedWakeUpTime = sleepTimePicker.date 24 alarm.runTimer() 25 performSegue(withIdentifier: "setToSleeping", sender: nil) 26 } 27 28}
CurrentTime.swift
Swift
1import Foundation 2 3class CurrentTime{ 4 var timer: Timer? 5 var currentTime: String? 6 var df = DateFormatter() 7 weak var delegate: SleepingViewController? 8 9 init(){ 10 if timer == nil{ 11 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateCurrentTime), userInfo: nil, repeats: true) 12 } 13 } 14 15 @objc private func updateCurrentTime(){ 16 df.dateFormat = "HH:mm" 17 df.timeZone = TimeZone.current 18 let timezoneDate = df.string(from: Date()) 19 currentTime = timezoneDate 20 delegate?.updateTime(currentTime!) 21 } 22} 23
ファイル構成
最初にプロジェクトを作成するときに、Interface を SwiftUI に選択したのではないでしょうか。
参照された記事は Swift なので、Interface を Swift にする必要があります。
Create New Project -> App の次の画面で選択できますので、Interface を Swift にして、打ち込まれたコードをコピーするなどして作り直して試してもらえますでしょうか。
コメントありがとうございます。
Interfaceの項目にはSwiftUIとStoryboardの二種類しかありません。
Storyboardでも大丈夫でしょうか?
すみません、Storyboard のtypoです。
ありがとうございます。
とりあえずStoryboardで新しく作成してみます。
もし、解決されたようであれば自己解決で、そうでなければご質問を編集されていただければ助かりますので、よろしくお願いいたします。
質問を編集致しましたので、もし可能であればお答え頂けると幸いです。
ちなみに、Storyboard の操作についてはご存知でしょうか。
コードを書くだけではなく、UI部品を Storyboard に配置し、関連づける操作が必要となります。
あと、コードの細部までは見ていませんが、オリジナルのコードと構成が異なっているようです。
記事中のリンクから、GoogleDrive にログインすることでオリジナルのソースコードを落とせるようですので、そちらを参考にされるのがよいかもしれません(ただし、Storyboardについてはご自身で作られる必要があります)。