前提・実現したいこと
現在,macOS版の音楽再生アプリを作成しています.
そこで音楽再生ボタンやシークバーなどをStoryBoardで生成して,それをViewController.swift(初期生成されるファイル)のViewControllerに紐づけてボタン操作で音楽再生・停止を行うことができるようになりました.しかし,音楽再生が止まった時にボタンの状態は再生状態になるのでボタンの状態も停止状態にしたいと考えています.
音楽再生のプロパティーやファンクションは別ファイル**(Player.swift)**のPlayerクラスに書いており,再生が停止した後に呼び出されるクロージャーで,ボタンの状態をON状態からOFF状態に変更したいと考えています.
ViewController.swift
1 2class ViewController: NSViewController { 3 4ここではPlayerButtonのOutletは定義せずにPlayerクラスで定義する 5//@IBOutlet weak var PlayerButton: NSButton! → Playerクラス 6 7//中略 8 9 @IBAction func pushPlayButton(_ sender: NSButton) { 10 11 guard (playurl != nil) else { 12 sender.setNextState() 13 return 14 } 15 16 17 if sender.state == NSControl.StateValue.on{ 18 player.play() 19 20 21 sender.image = NSImage(named: "NSTouchBarPauseTemplate") 22 23 }else{ 24 25 player.pause() 26 27 sender.image = NSImage(named:"NSTouchBarPlayTemplate") 28 } 29 30} 31} 32
player.swift
1 2Player:ViewController{ 3//音楽再生のパラメータの諸々 4//AVAudioPlayerNodeを使用している. 5var audioPlayerNode:AVAudioPlayerNode! 6 7//ボタンの状態を変更するためにここで紐付け 8 @IBOutlet weak var PlayerButton: NSButton! 9 10func play(){ 11 let remainFrames = AVAudioFrameCount(Float(sampleRate * length)) 12 13//任意の長さのファイルを指定の位置から再生させる 14 audioPlayerNode.scheduleSegment(audioFile, startingFrame: AVAudioFramePosition(Float(sampleRate * sPosition)), frameCount: remainFrames, at: nil){ 15//再生が終わったら呼ばれるハンドラ内 16 17//問題点→ ViewControllerのボタン状態を変更させる.これを実行したい. 18 19 self.TeacherPlayButton.state = NSControl.StateValue.off 20 self.TeacherPlayButton.image = NSImage(named: "NSTouchBarPauseTemplate") 21 22 23 } 24 25}
問題点
- ViewControllerに紐づけられているボタンの状態を別のクラスから変化させたい.(クロージャーを使用していなくても良い)
- どういった方法を使用すれば実現できるのかわからない
試したこと(自信ない)
delegageの使い方がいまいちわかっていないのですが,PlayerクラスにViewControllerクラスを継承しdelegateで解決すればよいかと思って継承してPlayerクラスにStoryBoardからControl^ + マウス操作でIBOutletを行ってやってみたのですが,
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
のエラーがでてきてViewControllerのボタンのオブジェクトをきちんと継承できていないと直感で感じましたが,ここからどうやって解決すれば良いかと頭を悩ませています.delegateの方法を使用すればいいのかもっと他の方法があるのか,
よろしければ解決方法を教えていただきたいです.
macOS版iOS版どちらのアドバイスでも良いのでよろしくお願いします!
補足情報(FW/ツールのバージョンなど)
- xcode 11.3.1
- macOSアプリ開発
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/08 00:51
2020/03/08 01:05