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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1023閲覧

音楽アプリの画面遷移でリセット処理したい。

satoshi2019

総合スコア13

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/06/05 07:16

編集2021/06/06 08:54

よろしくお願いします。

シンプルな音楽アプリを作っています。

PageViewControllerでViewControllerを3つ繋ぎました。

イメージ説明

下記参照のようにそれぞれのViewControllerのコードは同じ構成になっていますが、
画面遷移させた時に画面遷移前の再生を止めてスライダーを再生前に戻したいのです(ストップボタンを押した時と同じ処理でも良いです)。
どのようなコードをどこに打てば良いのか・・。

よろしければ教えていただければうれしいです。
PageViewControllewのコード

import

1 2class PageViewController: UIPageViewController { 3 4 // ① PageViewで表示するViewControllerを格納する配列を定義 5 private var controllers: [UIViewController] = [] 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 self.initPageViewController() 11 } 12 13 /// PageViewControllerの初期化処理 14 private func initPageViewController() { 15 16 // ② PageViewControllerで表示するViewControllerをインスタンス化する 17 let firstVC = storyboard!.instantiateViewController(withIdentifier: "FirstView") as! ViewController 18 let secondVC = storyboard!.instantiateViewController(withIdentifier: "SecondView") as! SecondViewController 19 let ThirdVC = storyboard!.instantiateViewController(withIdentifier: "ThirdView") as! ThirdViewController 20 21 // ③ インスタンス化したViewControllerを配列に保存する 22 self.controllers = [ firstVC, secondVC, ThirdVC ] 23 24 // ④ 最初に表示するViewControllerを指定する 25 setViewControllers([self.controllers[0]], direction: .forward, animated: true, completion: nil) 26 27 // ④ PageViewControllerのDataSourceを関連付ける 28 self.dataSource = self 29 } 30 31} 32 33// ⑤ PageViewControllerのDataSourceを定義 34// MARK: - UIPageViewController DataSource 35extension PageViewController: UIPageViewControllerDataSource { 36 37 /// ページ数 38 func presentationCount(for pageViewController: UIPageViewController) -> Int { 39 return self.controllers.count 40 } 41 42 /// 左にスワイプ(進む) 43 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 44 if let index = self.controllers.firstIndex(of: viewController), 45 index < self.controllers.count - 1 { 46 return self.controllers[index + 1] 47 } else { 48 return nil 49 } 50 } 51 52 /// 右にスワイプ (戻る) 53 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 54 if let index = self.controllers.firstIndex(of: viewController), 55 index > 0 { 56 return self.controllers[index - 1] 57 } else { 58 return nil 59 } 60 } 61 62} 63 64コード

ViewConerollerのコードは1つのViewcontrollerを提示しますが、オードの構成は
ViewController3とも同じになっています。mp3ファイル名だけ変えています。

import UIKit import AVFoundation class ViewController: UIViewController{ // MARK: 配列に曲のURLを入れておく let musicPaths = [ Bundle.main.bundleURL.appendingPathComponent("1.mp3"), Bundle.main.bundleURL.appendingPathComponent("2.mp3"), Bundle.main.bundleURL.appendingPathComponent("3.mp3") ] // MARK: どの曲が選ばれているのかを示す変数 var selectedMusic = 0 @IBOutlet weak var startButton: UIButton! @IBOutlet weak var stopButton: UIButton! var musicPlayer = AVAudioPlayer() @IBOutlet weak var labelRate: UILabel! @IBOutlet weak var sliderRate: UISlider! @IBAction func sliderRateMove(_ sender: UISlider) { musicPlayer.rate = sliderRate.value labelRate.text = String(format: "×%.1f",sliderRate.value) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. musicPlayer = AVAudioPlayer() musicPlayer.enableRate = true // MARK: STOPボタンを選択できないようにする stopButton.isEnabled = false } @IBAction func start(_ sender: Any) { do{ // 配列に入っている URL のうち、選択している曲の URL を渡す musicPlayer = try AVAudioPlayer(contentsOf: musicPaths[selectedMusic]) musicPlayer.enableRate = true } catch { print("エラー") } //numberOfLoopsに-1を指定すると無限ループする。 musicPlayer.numberOfLoops = -1 musicPlayer.play() // MARK: STARTボタンを選択された状態にする startButton.isSelected = true //startButton.backgroundColor = .red // MARK: STOP ボタンを選択できるようにする stopButton.isEnabled = true } @IBAction func stop(_ sender: Any) { musicPlayer.stop() // MARK: START ボタンの状態を戻す startButton.isSelected = false // MARK: STOP ボタンを選択できないようにする stopButton.isEnabled = false // ボタンを押下時にスライダーの値を0に戻す sliderRate.setValue(1, animated: true) } } // MARK: 押したボタンによって選択する曲を変える // 今回は曲を変更したら現在演奏している曲は停止させる} @IBAction func selectOne(_ sender: Any) { selectedMusic = 0 musicPlayer.stop() // ボタンを押下時にスライダーの値を0に戻す sliderRate.setValue(1, animated: true) // MARK: START ボタンの状態を戻す startButton.isSelected = false // MARK: STOP ボタンを選択できないようにする stopButton.isEnabled = false } } コード

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

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

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

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

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

satoshi2019

2021/06/06 08:55

ご指摘ありがとうございました。修正しました。
satoshi2019

2021/06/10 09:37

ご連絡遅くなりました。申し訳ありませんが、私の理解力不足で、 どこにコードを打ち込めば良いのかわかりません。 上述のサイトのDeclaration optional func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, 〜〜 transitionCompleted completed: Bool) を入力するのでよかったですか?AppDelegate に打ち込もうとしてもエラーが出てしまいます。 (Expected '{' in body of function declarationと'optional' can only be applied to protocol members Remove 'optional ')。
guest

回答1

0

ベストアンサー

こんな感じでしょうか。

  1. class PageViewController の前に protocol PlayerController を追加。

swift

1protocol PlayerController { 2 func stop(_ sender: Any) 3}
  1. PageViewController の initPageViewController メソッドの最後に self.delegate = self を追加。

diff

1 /// PageViewControllerの初期化処理 2 private func initPageViewController() { 3 // 略 4 5 // ④ PageViewControllerのDataSourceを関連付ける 6 self.dataSource = self 7+ self.delegate = self 8 }
  1. extension PageViewController: UIPageViewControllerDelegate を追加。

swift

1extension PageViewController: UIPageViewControllerDelegate { 2 func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 3 if completed { 4 for vc in previousViewControllers { 5 if let player = vc as? PlayerController { 6 player.stop(self) 7 } 8 } 9 } 10 } 11}
  1. ViewController, SecondViewController, ThirdViewController を PageViewController に適合させる。

(stop(_ sender: Any) メソッドはそのままでいいはず。)

diff

1-class ViewController: UIViewController{ 2+class ViewController: UIViewController, PlayerController {

あと、selectOne メソッドでボタンの tag を取得して selectedMusic の設定すると良いのでは。

diff

1 // MARK: 押したボタンによって選択する曲を変える 2 // 今回は曲を変更したら現在演奏している曲は停止させる} 3- @IBAction func selectOne(_ sender: Any) { 4+ @IBAction func selectOne(_ sender: UIButton) { 5 6- selectedMusic = 0 7+ selectedMusic = sender.tag 8 musicPlayer.stop() 9 // 略

投稿2021/06/10 10:15

hoshi-takanori

総合スコア7901

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

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

satoshi2019

2021/06/11 10:09

ありがとうございます。「3) extension PageViewController: UIPageViewControllerDelegate を追加。」ですが、PageViewController.swiftファイル内への入力で良いでしょうか?
hoshi-takanori

2021/06/11 10:12

はい、1 〜 3 は PageViewController.swift ファイルに書くのが一般的ですね。
satoshi2019

2021/06/11 21:06

できました。どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問